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

时间:2014-12-14 13:56:36

标签: ios objective-c afnetworking afnetworking-2

我正在尝试向服务器发送POST请求,但我仍然没有这样做。请帮我解决错误。

共享实例init:

- (id)init{
self = [self initWithBaseURL:[NSURL URLWithString:kBaseURL]];
if(self) {
    self.
    self.responseSerializer = [AFJSONResponseSerializer serializer];
    [self.requestSerializer setAuthorizationHeaderFieldWithUsername:@"user" password:@"password"];
    parsingQueue = dispatch_queue_create("com.company.queue.parser",NULL);
}
return self;

发布方法正文:

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:[FSApplicationManager sharedInstance].userToken, @"user_token", nil];
[params setObject:[NSNumber numberWithDouble:userId] forKey:@"user_id"];
[params setObject:[NSNumber numberWithDouble:filmId] forKey:@"film_id"];
[params setObject:[NSNumber numberWithBool:NO] forKey:@"sendCopy"];

if([subject length]>0){
    [params setObject:subject forKey:@"subject"];
}
[params setObject:message forKey:@"message"];

NSString *URLString = [NSString stringWithFormat:@"%@%@", kBaseURL, kAPISendMessageToUser];

NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST"
                                                               URLString:URLString
                                                              parameters:params
                                                                   error:nil];

[request addValue:[self signatureWithURL:[request.URL absoluteString] requestBody:[[NSString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding]] forHTTPHeaderField:@"X-SERVAPI-Signature"];
[request addValue:pub forHTTPHeaderField:@"X-SERVAPI-PublicKey"];

AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id response){
    NSLog(@"%@", response);

} failure:^(AFHTTPRequestOperation *operation,  NSError *error){
    NSLog(@"%@, \n response %@", error, operation.responseObject);
}];

[self.operationQueue addOperation:operation];

return operation;

错误我得到了:

  

错误域= AFNetworkingErrorDomain代码= -1011“请求失败:   内部服务器错误(500)“UserInfo = 0xcf0c2f0   {NSErrorFailingURLKey = https://ppd.someserver.com/api/user/send-message,   NSLocalizedDescription =请求失败:内部服务器错误(500),   NSUnderlyingError = 0xcf06ce0“请求失败:不可接受   content-type:text / html“,   AFNetworkingOperationFailingURLResponseErrorKey = {URL:https://ppd.someserver.com/api/user/send-message   } {状态代码:500,headers {       连接=关闭;       “Content-Encoding”= gzip;       “内容长度”= 1412;       “Content-Type”=“text / html; charset = UTF-8”;       日期=“太阳报,2014年12月14日13:46:57 GMT”;       P3P =“CP = \”NOI ADM DEV PSAi COM NAV OURo STP IND DEM \“”;       服务器= Apache;       Vary =“Accept-Encoding”;       “X-Powered-By”=“PHP / 5.3.3-7 + squeeze19”; }},

我试图联系负责服务器的人,这就是我得到的:

  

您无需在请求中添加内容类型   希望这样做,因为你正在使用POST方法,你应该使用:   内容类型:application / x-www-form-urlencoded;

2 个答案:

答案 0 :(得分:7)

问题是服务器正在向您发送HTML编码的答案。 您可以执行以下两个选项之一:

  1. 与服务器端人员交谈,将其编码为json。

  2. 尝试通过执行以下操作自行解决此问题:设置self.responseSerializer后将此行:

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

  3. 此行添加" text / html"到可接受的类型。提供服务器的响应仍然是可序列化的 - 你应该没问题。

答案 1 :(得分:5)

您正在接收HTML回复。要诊断正在进行的操作,查看HTML实际说明的内容非常有用。

暂时将响应序列化程序更改为AFHTTPResponseSerializer,然后检查HTML响应,它可能会提供一些信息,以便您了解请求的错误。或者您可以单独留下代码并观察与Charles或其他类似工具的交换。但目标是了解为什么你的状态代码为500,而可能给你一些线索。

关于请求为什么不起作用,我们很难说没有看到API。请求中关键名称样式的混合是可疑的(在某些情况下是下划线,在其他情况下是camelCase),但我们不了解API,因此不清楚这是否是一个问题。

关于Content-Type,AFNetworking会为您执行此操作(并将使用application/x-www-form-urlencoded,因此我不认为这是问题所在。

如果API支持团队不熟悉Objective-C / AFNetworking代码示例,您可能希望使用诸如Charles之类的工具来观察请求。然后捕获发送的原始请求,并且API支持团队可以更好地诊断问题,而不会分散Objective-C / AFNetworking代码。