Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AF2.0从故障块中的代码400获取JSON_Ios_Iphone_Objective C_Afnetworking_Afnetworking 2 - Fatal编程技术网

Ios AF2.0从故障块中的代码400获取JSON

Ios AF2.0从故障块中的代码400获取JSON,ios,iphone,objective-c,afnetworking,afnetworking-2,Ios,Iphone,Objective C,Afnetworking,Afnetworking 2,我正在使用AFHTTPRequestOperationManager进行POST请求。现在我故意输入错误信息来处理400错误代码。现在,web服务实际上返回一个JSON,并向用户解释他们做错了什么。我非常想让这个JSON在UIAlertView中显示消息。但是,故障块: [operationManager POST:ServerURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObj

我正在使用
AFHTTPRequestOperationManager
进行
POST
请求。现在我故意输入错误信息来处理
400
错误代码。现在,web服务实际上返回一个
JSON
,并向用户解释他们做错了什么。我非常想让这个
JSON
UIAlertView
中显示消息。但是,故障块:

[operationManager POST:ServerURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: Status Code: %d", operation.response.statusCode);
}
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"Failed: Status Code: %d", operation.response.statusCode);
 }];
不会传递类似于成功块中的responseObject。那么,有人知道我如何访问Web服务返回的JSON(错误为400)吗?
NSError*error
只给出了
请求失败:错误请求(400)
而不是返回的JSON


如果有任何帮助,我们将不胜感激,
Mike

查看
-responseObject
的代码,似乎HTTP错误阻止了它的填充。您可以直接获取
responseData
并自己解析它,但我认为这要么是一个bug,要么是一个很好的增强请求。(看起来,
-responseObject
在决定是否尝试构建响应对象时,可能应该检查
self.responseSerializationError
,而不是
self.error

您可以执行以下任一解决方案

1) 将
acceptableStatusCodes
设置为接受400状态码,然后在成功块中处理

manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
2) 创建一个自定义ResponseSerializer,如下所示,将responseObject插入NSError userInfo,并在failure块中进行处理

Pro提示:AFNetworking是开源的,只需查看AFHTTPRequestOperation中的方法

setCompletionBlockWithSuccess:failure:

responseObject

error

以下代码为我编写:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager.requestSerializer setValue:@"parse-application-id-removed" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [manager.requestSerializer setValue:@"parse-rest-api-key-removed" forHTTPHeaderField:@"X-Parse-REST-API-Key"];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    manager.securityPolicy.allowInvalidCertificates = YES;

    NSString *URLString = [NSString stringWithFormat:@"%@/%@", BASE_URL,methodName];



    [manager POST:URLString parameters:requestDict success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSLog(@"JSON: %@", responseObject);

        [myDelegate StopIndicator];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        [myDelegate StopIndicator];
    }];

我在AFN网络中也遇到了同样的问题,因为我没有使用

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                parameters:(id)parameters
                  progress:(void (^)(NSProgress * _Nonnull))uploadProgress
                   success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                   failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
请尝试使用该选项:-

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                parameters:(id)parameters
 constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                  progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                   success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
-(NSURLSessionDataTask*)POST:(NSString*)URLString
参数:(id)参数
带块构造体:(void(^)(id formData))块
进度:(可空空(^)(NSProgress*_Nonnull))上载进度
成功:(void(^)(NSURLSessionDataTask*task,id responseObject))成功
失败:(void(^)(NSURLSessionDataTask*任务,NSError*错误))失败

谢谢,

嘿,杰西,谢谢你的回答,非常详细。我现在可能会让snoop在我周围,看看我是否能做一点改变,但我们会看看。有没有任何方法可以用json返回服务器响应。然而您可能已经解决了这个问题,但是可以从失败中的AFHTTPRequestOperation对象获取responseObjectblock@tbag问题是失败块中的responseObject为nil。Github上有很多关于这一点的问题,但是Matt说这会破坏API设计,我得到了相同的响应,你找到解决问题的办法了吗?这个答案对我很有用,