来自GET请求的AFNetworking 3.0 404响应

时间:2016-12-01 23:16:22

标签: objective-c afnetworking afnetworking-3

我正在尝试使用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正在解析我正在击中的网址引发的响应问题。

所以有两个问题:

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

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

_httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];

答案 1 :(得分:0)

来自评论:

事实证明,默认是json序列化器。但总的来说,我认为我考虑它的方式是不正确的。从我设置的服务器返回的响应都是JSON,所以我应该使用默认值。我的问题是我没有访问端点,因此返回的响应是HTML,因此它抛出了两个错误,一个是我们未能访问端点(404),另一个是它无法解析text / html。第二个被抛出的原因是因为我没有达到终点,所以解决这个问题就固定了另一个。