我正在尝试向服务器发送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;
答案 0 :(得分:7)
问题是服务器正在向您发送HTML编码的答案。 您可以执行以下两个选项之一:
与服务器端人员交谈,将其编码为json。
尝试通过执行以下操作自行解决此问题:设置self.responseSerializer后将此行:
self.operationManager.responseSerializer.acceptableContentTypes = [self.operationManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
此行添加" 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代码。