iOS は AFNetworking を使用してエラー Domain=NSCocoaErrorDomain Code=3840、Response Code=-1011、http リクエスト エラー 404 の解決策を報告します

最近、AFNetworking を使用してネットワーク リクエストを行うときにバグが発生しました。この問題は長い間解決されてきました。出力されたエラーには、Domain=NSCocoaErrorDomain Code=3840, Domain=com.alamofire.error.serialization.response Code=-1011 "Request" が表示されます。失敗しました: 見つかりません (404) "。そういえばなんで404なの?投稿リクエストが使用され、リクエストコードは次のとおりです。

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:EnergyManagementURL]];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",nil];
    [manager POST:postPath parameters:JSONObjectParameter headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (handler) {
            handler(responseObject);
        }
    } failure:^(NSURLSessionDataTask *task, NSError * error) {
        if (failHandler) {
            failHandler();
        }
    }];

バックグラウンドでは問題なく、postman でテストするとデータは取得できたのですが、なぜ 404 になってしまうので、アップロードパラメータのマネージャーの設定に問題があるのではないかと思いました。しかし、問題がないことがわかったので、AFHTTPRequestSerializer と AFHTTPResponseSerializer の代わりに AFJSONRequestSerializer と AFJSONResponseSerializer を使用しました。その後、前から渡されたパラメータと後ろから渡されたパラメータを何度も比較した結果、ようやく問題が見つかりました。その理由は次のとおりです。

NSJSONWritingPrettyPrinted モードでは、生成される部分文字列に見た目を考慮してスペースが含まれるため、コンパイルされたデータの長さが長くなり、サーバーの解析で問題が発生します。解決策は、このパラメータを 0 に変更することです。具体的な修正内容は以下の通りです。


    AFJSONRequestSerializer *rqSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:0];//NSJSONWritingPrettyPrinted 设置为0
    rqSerializer.stringEncoding = NSUTF8StringEncoding;

    AFJSONResponseSerializer *rsSerializer = [AFJSONResponseSerializer serializer];
    rsSerializer.stringEncoding = NSUTF8StringEncoding; 
    
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:EnergyManagementURL]];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",nil];
    [manager POST:postPath parameters:JSONObjectParameter headers:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        if (handler) {
            handler(responseObject);
        }
    } failure:^(NSURLSessionDataTask *task, NSError * error) {
        if (failHandler) {
            failHandler();
        }
    }];

 

おすすめ

転載: blog.csdn.net/qq_37269542/article/details/108618780