最近、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();
}
}];