2

既存のプロジェクトのバグを修正する作業を行っています。問題は、AFHTTPClient が有効な JSON 応答を期待しているのに、サーバーが ""\" Operation complete\"" (すべての引用符と角かっこが返される) のような意味不明なものを返すことです。これにより、操作が失敗し、ヒットします。応答を解析できないため、失敗ブロック. それにもかかわらず、サーバーはステータス コード 200 を返し、操作が完了したことを喜んでいます。

私はそのようにAFHTTPClientを拡張するクラスを持っています(私の.hファイルから実行)

@interface AuthClient : AFHTTPClient

  //blah blah blah

@end

私の実装ファイルでは、クラスは次のように初期化されます。

- (id)initWithBaseURL:(NSURL *)url{
    if (self = [super initWithBaseURL:url]) {        
        self.parameterEncoding = AFFormURLParameterEncoding;
        self.stringEncoding = NSASCIIStringEncoding;

        [self setDefaultHeader:@"Accept" value:@"application/json"];
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    }

    return self;
}

私が行っている呼び出しは、上記のクラスで行われ、次のように発生します。

- (void)destroyToken:(NSString *)token onCompletion:(void (^)(BOOL success))completion onFailure:(void (^)(NSError *error))failure{

    [self postPath:@"TheServerURL" parameters:@{@"token": token} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSError *error;
        //Do some stuff
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //Don't want to be here.
    }];
}

失敗ブロック内では、エラー オブジェクトの _userInfo セクションに次のようにエラーが返されます。

[0] (null) @"NSDebugDescription" : @"JSON テキストが配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません。"

エラー コードは 3480 です。

周りのグーグルから、私は NSJSONReadingAllowFragments のようなものを設定する必要がありますが、現在の設定がどのように/どこにあるのかわかりません。誰にもアイデアはありますか?

4

1 に答える 1

1

応答は JSON ではないようです。では、そうでない場合に JSON のように処理しようとするのではなく、HTTP 応答自体を受け入れないのはなぜでしょうか?

JSON 形式のリクエストを送信しているが、テキスト レスポンスだけが必要な場合は、AFNetworking 2.0 を使用して次のようにできます。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlString parameters:@{@"token":token} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"responseString: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

または、1.x の場合:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
client.parameterEncoding = AFJSONParameterEncoding;
NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:@{@"token" : token}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"response: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

[client enqueueHTTPRequestOperation:operation];
于 2013-11-13T23:12:28.420 に答える