2012-06-07 2 views
7

우리는 우리의 레일 서버에 업데이트 PUT 요청을 보내는 여러 번 시도하고 우리는iOS 기기가 Rails 앱에 PUT 요청을 보낼 수 있습니까?

우리의 업데이트 방법은 매우 간단 404 "존재하지 않는 찾고 있던 페이지"(실제로 일반 레일) 수신 계속.

def update 
@user = User.find(params[:id]) 

respond_to do |format| 
    if @user.update_attributes(params[:user]) 
    format.html { redirect_to @user, notice: 'User was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

나는 업데이트 방법을 테스트하기 위해 명령 줄에서 CURL 실행 끝

, 그것은 잘 작동합니다. 그러나 objective-c에서 같은 방법을 시도하면 항상 404 오류가 발생합니다.

내 질문은 : iOS 장치가 NSURLConnection을 사용하여 서버에 PUT 요청을 보낼 수 있습니까 아니면 구현되지 않았습니까?

UPDATE :

NSString *dataString = @"user[first_name]=bob"; 
NSData *postBodyData = [NSData dataWithBytes: [dataString UTF8String] length:[dataString length]]; 
NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
[request setHTTPBody:postBodyData]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 

이 당신이 NSMutableURLRequest을하고 HTTP 방식을 설정할 수 있습니다

NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json?user[first_name]=bob"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 
+0

루비 코드 경우 게시 귀하의 질문에 대한 IOS 지원 아마도 당신을 잘하지 않습니다. 대신 Objective-C 코드를 게시하면 HTTP 메서드를 올바르게 설정했는지 확인할 수 있습니다 (아래 그림 참조). – glorifiedHacker

+0

네, 죄송합니다. 나는 레일즈 끝을 쓰고 있는데, 다른 개발자가 목표를 쓰고 있었고 그의 코드에 접근 할 수 없었다. 이제 끝났어. –

+0

'['및 ']'문자를 이스케이프 처리하지 않는다는 사실과 관련이 있는지 궁금합니다. @ "user % 5Bfirst_name % 5D = brian"문자열에서 파생 된 데이터로 HTTP 본문을 설정해보십시오. – glorifiedHacker

답변

6

데이터베이스를 업데이트하는 데이터베이스를 업데이트하지 않습니다 :

- (void)setHTTPMethod:(NSString *)method 

문자열에 @"PUT"을 지정합니다.

다음은 이러한 요청으로부터 NSURLConnection을 만드는 방법입니다.

NSMutableURLRequest *myMutableRequest[[NSMutableURLRequest alloc] initWithURL:myURL]; 
[myMutableRequest setHTTPMethod:@"PUT"]; 
[NSURLConnection connectionWithRequest:myMutableRequest delegate:myDelegate]; 
+1

시도했지만 작동하지 않았습니다. POST 및 GET 요청이 작동합니다. –

+0

URL, 매개 변수 또는 헤더에 문제가있을 수 있습니다. 요청을 디버그하여 형식이 올바른지 확인 했습니까? 요청에 cURL에 제공된 정확한 문자열을 넣고 도움이되는지 확인할 수 있습니다. –

+0

흠, 이것은 흥미 롭습니다.PUT 요청에 [setHTTPBody : @ "user [first_name] = brian"]을 통해 본문 데이터를 추가하려고하면 200 응답으로 응답하지만 데이터베이스 레코드는 업데이트되지 않습니다. 그러나 URL에 데이터를 추가하면 변경됩니다. 예 : test.com/users/1.json?user[first_name]=joe <- PUT을 통해 작동하고 작동합니다! –

4

@ "POST"

로 HTTP 메소드 유형을 설정하고 요청 본문에 매개 변수를 추가 : 그것은 작동합니다 @ "_ 방법"

키에 대해 "PUT"@ . akshay1188 @ 사실

+0

당신은 예의와 완전한 작동 예제를 제공 할 수 있습니까? – andi

7

은 실행 가능한 솔루션을 가지고,하지만 난 더 우아한 방법은 요청에 "응용 프로그램/x-www-form-urlencoded를"콘텐츠 형식을 추가하는 것입니다 생각 :

[request setHTTPMethod:@"PUT"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];