2

作成した Sinatra API を使用して、iPhone からリクエストを投稿しようとしています。現在、私の Sinatra アプリが行っていることは、送信されたリクエストを出力することだけです。これはそのためのコードです:

post '/profile' do

    puts "#{params}"
end

私の目標 c も非常に単純です。それが行うのは、投稿リクエストを API に送信することだけです。

NSURL *url = [NSURL URLWithString:kBaseURLString];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:JSON, @"json", nil];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"/profile" parameters:dictionary];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"SUCCESS");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];
[operation start];

JSON (obj-c の 3 行目) が @"test" のような非常に短い文字列の場合、Sinatra は次のように正しく出力します。

{"json"=>"test"}

非常に長い JSON blob である実際の JSON プロファイル データを使用すると、Sinatra は次のように出力します。

{"json"=>"(null)"}

長いブロブが通過する理由がわかりません。私は正しい文字列を渡していると 100% 確信していますが、Sinatra はそれを受け取っていません。私の現在の理論では、Sinatra にはリクエストの最大文字数制限があるというものですが、私は Sinatra と Ruby を初めて使用するので、それをテストする方法がわかりません。何がうまくいかないのですか?

アップデート:

まず、あなたの提案をありがとうKjuly。Sinatra の文字制限について、私が間違っていたことに気付きました。obj-c では、3 行目に JSON blob を持つ辞書のログを作成しています。これには json blob があります。ただし、4 行目で NSMutableURLRequest の本文をログに記録すると、本文は空です。小さな JSON ブロブを使用すると、本文がいっぱいになります。

NSMutableURLRequest には文字制限がありますか? 私の非常に大きな辞書を大きな JSON blob で受け入れず、小さなものでは受け入れない理由を誰でも考えることができますか?

ありがとう!

再度更新:

リクエストの本文が正しく入力されるようになりました。この行を 3 行目に追加する必要がありました。

[httpClient setParameterEncoding:AFJSONParameterEncoding];

今、私は Sinatra から HTTPResponse でこの応答を取得しています:

Error Domain=com.alamofire.networking.error Code=-1016 "Expected content type {(
    "text/json",
    "application/json",
    "text/javascript"
)}, got text/html"

シナトラは今ちょうど印刷中です

{}

{"json"=>"(null)"} の代わりに

何が起こっているのかまだわかりません。

アップデート 3

さて、Sinatra からの HTTPResponse (text/json のもの) だと思ったのは、AFNetworking で Sinatra から text/html を返していたからです。Sinatra が受信している本文を確認したところ、巨大な JSON ブロブがそこに含まれています。ただし、「params」はまだ空です。

誰でも理由がわかりますか?

修正済み

JSON を sinatra に投稿するときは、リクエストの本文を直接読む必要があるようです。シナトラでは、次のようにします。

プロファイル = JSON.parse(request.body.read.to_s)

次に、プロファイルは解析されたオブジェクトです。

4

1 に答える 1

1

代わりに使用する必要があると思いますAFJSONRequestOperation。サンプルコードは次のとおりです。

// Fetch Data from server
NSURL *url = [NSURL URLWithString:@"https://gowalla.com/users/mattt.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation * operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                success:^(NSURLRequest * request, NSHTTPURLResponse * response, id JSON) {
                                                  NSLog(@"Name: %@ %@", [JSON valueForKeyPath:@"first_name"], [JSON valueForKeyPath:@"last_name"]);
                                                }
                                                failure:nil];
[operation start];

または、 WIKI PAGEにアクセスできます。「ステップ 4: JSON をダウンロードして解析する」を参照してください。

于 2012-02-20T04:56:03.387 に答える