2

いくつかのAPIを備えたサーバーがあり、このAPIをiPadでクライアントとして使用しています。コードは次のとおりです。

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***/api/user"]];
    req.HTTPMethod = @"put";
    req.HTTPBody = data; // it is string data from json dictionary

    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        NSString *userData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//...
    }];

iPad 3 ではすべて動作していますが、そのコードを iPad 1 でテストしようとすると、エラーが発生します。より具体的には、エラーが発生した場合でもサーバーが JSON のみを返すため、エラーがクライアント側にあるのかサーバー側にあるのかを確認できます。したがって、通常、userData には辞書付きの文字列が含まれている必要があります。

{ "auth": 1, "email":"some@mail.com", "error": 0} 

サーバーが返されることがあります(間違った認証データをサーバーに送信しようとすると):

{ "auth": 0, "email":"", "error": 400, "errorMessage":"Bad Request"} 

しかし、私がiPad 1で得ているのはhtml文字列です:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.2.1</center>
</body>
</html>

まったく同じオプション、同じインターネット接続があるため、少し混乱していますが、iPad 1 と iPad 3 の動作は異なります。重要な注意: iPad 1 には iOS 5.1.1 があり、iPad 3 には 6.1 があります。非常に簡単な解決策があるはずですが、わかりません。また、iPad のモデルが実際に問題になるかどうかもわかりません。また、同期リクエストを試しましたが、うまくいきませんでした...

4

1 に答える 1

3

http://w3.org/Protocols/rfc2616/rfc2616-sec5.htmlによると、HTTP メソッドは大文字と小文字を区別するため、使用する必要があります。

req.HTTPMethod = @"PUT";

iOS 6 はリクエスト メソッドを自動的に大文字に変換するようですが、iOS 5 は変換しません (ネットワーク モニターで確認できます)。

于 2013-03-18T16:27:17.237 に答える