4

特定の JIRA サーバーとやり取りする iPhone アプリを作成しようとしています。ログインするための次のコードがあります。

NSURL *url = [[NSURL alloc] initWithString:@"https://mycompany.atlassian.net/rest/auth/latest/session/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
NSString *postString = [NSString stringWithFormat:@"{\"username\":\"%@\",\"password\":\"%@\"}", username, password];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept" ];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:
    ^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"ERROR: %@", error);

    }
 ];
 [operation start];

しかし、Content-Typeに関係する次のエラーが表示されます:

ERROR: Error Domain=AFNetworkingErrorDomain Code=-1011
"Request failed: unsupported media type (415)"
UserInfo=0x8cd6540
{
  NSErrorFailingURLKey=https://mycompany.atlassian.net/rest/auth/latest/session/,
  NSLocalizedDescription=Request failed: unsupported media type (415),
  NSUnderlyingError=0x8c72e70
  "Request failed: unacceptable content-type: text/html", 

何が問題なのかわからない。私はこの質問を見つけましたが、これは同様の問題かもしれないと思いましたが、答えは、クラスを使用するかAFJSONRequestOperation(そのクラスを持たない AFNetworking バージョン 2 を使用しているため使用できません)、または修正することを示しています。それはサーバー側にあります(これも明らかな理由でできません)。

サーバー側を修正できず、使用できない場合、このエラーを修正するにはどうすればよいAFJSONRequestOperationですか?

4

5 に答える 5

14

AFNetworking 2.0 を使用している場合は、次のPOST方法を使用できます。これにより、これが少し簡略化されます。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *parameters = @{@"username":username, @"password":password};
[manager POST:@"https://mycompany.atlassian.net/rest/auth/latest/session/" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

これにより、リクエストが作成Content-Typeされ、設定に従って設定されrequestSerializer、JSON がエンコードされます。AFNetworking の利点の 1 つは、NSURLRequestオブジェクトを手動で構築および構成する雑草から抜け出せることです。


ちなみに、"Request failed: unacceptable content-type: text/html" エラーは、受信を期待していたもの (JSON など) に関係なく、HTML 応答を受信したことを意味します。これは非常によくあることです。多くのサーバー エラー (たとえば、サーバーがリクエストの形式が正しくないことを通知するなど) では、HTML エラー メッセージが生成されます。その HTML を表示したい場合は、failureブロック内でoperation.responseString.

于 2014-01-23T23:46:43.553 に答える
2

問題は、次の 1 行であることがわかりました。

[request setValue:@"application/json" forHTTPHeaderField:@"Accept" ];

する必要があります

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type" ];

エラーは解決されました。(編集:両方が必要です。CouchDeveloperのコメントを参照してください。)

編集
Robのソリューションの方が優れているので、それを使用します。私は実際に彼が示したものと同様の解決策を試みましたが、彼がラインを持っていたところに、

manager.requestSerializer = [AFJSONRequestSerializer serializer];

私は次の行を持っていました:

[manager.requestSerializer
    setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

...うまくいきませんでした。それを機能させてくれたRobに称賛を!

于 2014-01-23T23:04:24.397 に答える
1

AFNetworking 2.0でも同じ問題がありましたが、解決策は、AFHTTPRequestSerializerタイプ(リクエストがJSONの場合)を次のように設定する必要があることでした。

AFHTTPSessionManager *myHTTPManager = ...
[myManager setRequestSerializer:[AFJSONRequestSerializer serializer]];

との両方を設定する必要がAFHTTPResponseSerializerあります。AFHTTPRequestSerializer

于 2014-04-05T13:09:47.057 に答える
0

デフォルトの作成済みクラスAFAppDotNetAPIClientを使用していて、このエラーに直面した場合。responseSerializerを追加する必要があります。共有メソッドが次のようになることを確認してください-

+ (instancetype)sharedClient {

static AFAppDotNetAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
    _sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]];
    _sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    _sharedClient.responseSerializer = [AFHTTPResponseSerializer serializer];
});
return _sharedClient;}
于 2014-07-22T11:45:58.397 に答える