2012-06-07 11 views
7

Railsサーバーに更新PUTリクエストを何度も送信しましたが、404ページの "探していたページが存在しません"iOSデバイスからRailsアプリケーションにPUTリクエストを送信できますか?

更新方法は非常に簡単です(実質的に一般的なレール)。

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 

エンド

私はupdateメソッドをテストするには、コマンドラインから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

Rubyコード際に投稿しますあなたの質問は、iOSのサポートはおそらくあなたに良いことはしません。代わりにObjective-Cコードを投稿すると、HTTPメソッドを正しく設定しているかどうかを調べることができます(下記のDavid Vのように)。 – glorifiedHacker

+0

ええ、それについて申し訳ありません。私はレールの終わりを書いていますが、別の開発者が目的を書いていました.c彼のコードにアクセスできませんでした。それは今起きている。 –

+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リクエストに本体のデータを追加しようとしたときに、setResponseBody:@ "user [first_name] = brian"]というレスポンスが返されますが、データベースレコードは更新されません。しかし、私は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"]; 
関連する問題