来自 GET 请求的 AFNetworking 3.0 404 响应

Posted

技术标签:

【中文标题】来自 GET 请求的 AFNetworking 3.0 404 响应【英文标题】:AFNetworking 3.0 404 response from GET request 【发布时间】:2016-12-01 23:16:22 【问题描述】:

我正在尝试使用 AFNetowrking 发出 GET 请求。代码如下:

@property (nonatomic, readwrite) AFHTTPSessionManager *httpSessionManager;

...

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    _httpSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:self.baseURL]
                                                   sessionConfiguration:config];

    _httpSessionManager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

    _httpSessionManager.responseSerializer.acceptableContentTypes = [_httpSessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];


    _httpSessionManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    _httpSessionManager.securityPolicy.allowInvalidCertificates = YES;

...

NSMutableDictionary* parameters = [self defaultUserSessionParameters];
NSString *url = [self constructURLWithEndpointPath:@"lead_sources.json"];

RequestSuccessBlock winBlock = ^(NSURLSessionDataTask *task, id responseObject)

    NSLog(@"GetLeadSources, response Object: %@", [responseObject description]);
    NSArray* leadSources = responseObject[@"lead_sources"];

    if (!leadSources)
    
        NSString* errorString = @"Successfully retrieved lead sources but no values were returned!";
        NSLog(@"%@",errorString);
        NSError* error = [NSError bpdErrorWithDescription:errorString];
        completion(nil, error);
    
    else
    
        completion(leadSources,nil);
    
;

RequestFailureBlock failureBlock = ^(NSURLSessionDataTask *task, NSError *error)

    NSLog(@"FAILURE: get lead sources, Error: %@", error);
    NSString* ErrorResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];

    NSLog(@"server error response: %@ /end", ErrorResponse);
;

[self.httpSessionManager GET:url
                  parameters:parameters
                    progress:nil
                     success:winBlock
                     failure:failureBlock];

但我每次都会收到此错误:

请求失败:不可接受的内容类型:text/html

我做了一些挖掘,发现这个错误是由于我的响应序列化程序而引发的,所以我添加了这一行来解决这个问题:

_httpSessionManager.responseSerializer.acceptableContentTypes = [_httpSessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

但是当我添加这个时,我得到了以下错误:

JSON 文本未以数组或对象开头,并且允许未设置片段的选项。

为此,我发现我需要设置阅读选项以允许片段。我尝试将序列化程序设置为:

_httpSessionManager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

然后我得到另一个错误:

字符 0 周围的值无效

我想我必须将响应序列化程序设置为 AFHTTPResponseSerializer,但我似乎无法弄清楚如何使用该序列化程序允许片段。

无论如何,我认为这不是抛出 404 的原因。我相信我没有访问我尝试访问的域,并且 AFNetworking 在解析我正在访问的 url 引发的响应时遇到问题。

所以两个问题:

如何才能让序列化程序正确解析我的响应? (又名沉默这三个错误?)

为什么会抛出 404?我可以导航到它试图点击的网址,但它说页面不可用

提前致谢!

【问题讨论】:

【参考方案1】:

您可以将响应序列化程序设置为 AFHTTPResponseSerializer,如下所示。但是,如果错误 404 是由于资源不再位于您提交的路径 url 上,唯一的解决方案是找出正确的 url 是什么。

_httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];

【讨论】:

这不是默认的响应序列化程序吗?它不应该已经在使用它了吗? 不知道是不是默认的。我遇到了类似的错误,然后我遇到了一个 SO 帖子,他们建议我添加这一行。我遇到的错误是:“错误:错误域=com.alamofire.error.serialization.response Code=-1016“请求失败:不可接受的内容类型:文本/html”” 原来默认是json序列化器。但总的来说,我认为我的想法是不正确的。从我设置的服务器返回的响应都是 JSON,所以我应该使用默认值。我的问题是我没有到达端点,所以返回的响应是 HTML,所以它抛出了两个错误,一个是我们未能到达端点 (404),另一个是它无法解析 text/html。第二个被抛出的原因是因为我没有达到端点,所以修复该问题修复了另一个。【参考方案2】:

来自cmets:

原来默认的是 json 序列化器。但总的来说,我认为我的想法是不正确的。从我设置的服务器返回的响应都是 JSON,所以我应该使用默认值。我的问题是我没有到达端点,所以返回的响应是 HTML,所以它抛出了两个错误,一个是我们未能到达端点 (404),另一个是它无法解析 text/html。第二个被抛出的原因是因为我没有达到端点,所以修复该问题修复了另一个。

【讨论】:

以上是关于来自 GET 请求的 AFNetworking 3.0 404 响应的主要内容,如果未能解决你的问题,请参考以下文章

在 AFNetworking 3 GET 请求中删除查询末尾的问号

AFNetworking网络请求的get和post步骤

AFNetworking 2.0 参数字典不适用于 GET 请求

iOS开发之AFNetworking 3.0.4使用

使用 AFNetworking 缓存不需要的 GET 请求

如何使用 AFNetworking-2.0 执行 JSON 编码的 GET 请求?