AFNetworking 2.0 和请求标头

Posted

技术标签:

【中文标题】AFNetworking 2.0 和请求标头【英文标题】:AFNetworking 2.0 and Request header 【发布时间】:2014-08-30 10:54:33 【问题描述】:

我正在使用 AFNetworking 2.0。 我将我的单例类实现为以下子类:AFHTTPSessionManager

+ (RESTClientManager *)sharedManager

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        _sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://myurl.com:8080"]];
    );

    return _sharedInstance;



- (instancetype)initWithBaseURL:(NSURL *)url

    self = [super initWithBaseURL:url];

    if (self) 
        self.responseSerializer = [AFJSONResponseSerializer serializer];
        self.requestSerializer = [AFJSONRequestSerializer serializer];
    

    return self;

当我需要进行 POST 时,我会使用以下代码:

[self POST:@"/users" parameters:requestParameters success:^(NSURLSessionDataTask *task, id responseObject) 
        NSLog(@"Ok");

    
    failure:^(NSURLSessionDataTask *task, id responseObject) 
        NSLog(@"Failed");
    ];

但我得到错误:

 status code: 406, headers 
    Connection = "keep-alive";
    "Content-Length" = 0;
    "Content-Type" = "application/json";
    Date = "Sat, 30 Aug 2014 09:29:15 GMT";
    Server = "8";
    "X-Powered-By" = "Undertow 1";
 , NSLocalizedDescription=Request failed: unacceptable (406)

我尝试使用 RESTful 客户端发出相同的请求: 当我添加这个标题字段时,这很好用:

接受”:应用程序/json 内容类型:应用程序/json

我怎样才能使用 AFNetworking 2.0 获得这个??


编辑

参数字典的打印

po requestParameters

    city = "";
    country = Italy;
    deviceToken = "";
    email = "email@sdsd.it";
    mobileNumber = "";
    name = "Test_ios";
    phoneNumber = "";
    postalCode = "";
    street = "";
    streetNumber = "";
    surname = "";
    userId = 00000001;

【问题讨论】:

【参考方案1】:

如果您在请求标头中添加了正确的Content-Type,那么您的参数可能是错误的来源。如果您可以联系负责后端服务器的任何人,您可能能够从他们那里获得准确的错误报告。如果不是,请确保参数不为空,并且您传递的内容遵循服务器使用的任何标准。

如果我们能看到传递的参数,我们可以为您提供更好的帮助。

【讨论】:

我生成一个 NSDictionary 并在这一行中传递它:[self POST:@"/users" parameters:requestParameters success:... 我编辑了我的问题:现在你可以找到字典参数的打印。 Tnx 您确定您的服务返回 JSON 响应吗? ***.com/questions/14251851/… 在我读到的工作的规范文档中,这些参数应该是一个Json:刚刚读到:Body JSON 包含用户详细信息。我不明白:我是否要将此 Json 作为 NSData 添加到请求正文中,还是可以将 NSDictionary 传递给 AFNetworking 的 POST 方法??? 错误代码 406 是“您的后端服务说它返回的响应类型未在您的客户端请求的 Accept-Type HTTP 标头中提供”这意味着由于某种原因您的内容类型并接受尚未设置为 Json,即使您已经这样做了。在发出 POST 请求之前尝试 nslog self.requestserializers.allhttpheaders。 (我是凭记忆写的,所以实际的属性名称可能完全不同)

以上是关于AFNetworking 2.0 和请求标头的主要内容,如果未能解决你的问题,请参考以下文章

用于 POST 的 AFNetworking 2.0 自定义标头

AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中

使用 AFNetworking 2.0 签署 API 请求

[AFN]AFNetworking错误总结

AFNetworking 2.0:传递标头信息

如何设置 AFNetworking 2.0 默认标头?