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

nin*_*iOS 4 objective-c ios 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;
Run Code Online (Sandbox Code Playgroud)

帖子方法体:

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;
Run Code Online (Sandbox Code Playgroud)

错误我得到:

错误域= AFNetworkingErrorDomain代码= -1011"请求失败:内部服务器错误(500)"UserInfo = 0xcf0c2f0 {NSErrorFailingURLKey = https://ppd.someserver.com/api/user/send-message,NSLocalizedDescription =请求失败:内部服务器error(500),NSUnderlyingError = 0xcf06ce0"请求失败:不可接受的内容类型:text/html",AFNetworkingOperationFailingURLResponseErrorKey = {URL:https ://ppd.someserver.com/api/user/send-message } {status code:500 ,标题{Connection = close; "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方法,您应该使用:Content-Type:application/x-www-form-urlencoded;

o.s*_*hnn 7

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

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

  2. 通过执行以下操作尝试自行修复:设置self.responseSerializer后,将此行放入:

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

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


Rob*_*Rob 5

您正在接收HTML响应.要诊断正在发生的事情,查看HTML实际说明的内容很有用.

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

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

关于Content-Type,AFNetworking将为你做这件事(并将使用application/x-www-form-urlencoded,所以我不认为这是问题.

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