AFNetworking 和 POST 请求
Posted
技术标签:
【中文标题】AFNetworking 和 POST 请求【英文标题】:AFNetworking and POST Request 【发布时间】:2012-09-16 14:33:17 【问题描述】:在从AFNetworking
发出 POST 请求时,我在 error.userInfo 中收到此响应。
谁能告诉我缺少任何明显的东西或需要在我的服务器端修复的东西?
请求失败并出现错误:错误域=AFNetworkingErrorDomain Code=-1016 "预期的内容类型( “文本/json”, “应用程序/json”, "text/javascript" ),得到 text/html" UserInfo=0x6d7a730 NSLocalizedRecoverySuggestion=index 测试, AFNetworkingOperationFailingURLResponseErrorKey=, NSErrorFailingURLKey=http://54.245.14.201/, NSLocalizedDescription=预期的内容类型 ( “文本/json”, “应用程序/json”, "text/javascript" ), 得到 text/html, AFNetworkingOperationFailingURLRequestErrorKey=http://54.245.14.201/>, AFNetworkingOperationFailingURLRequestErrorKey = "http://54.245.14.201/>"; AFNetworkingOperationFailingURLResponseErrorKey = ""; NSErrorFailingURLKey = "http://54.245.14.201/"; NSLocalizedDescription = "预期的内容类型 (\n \"text/json\",\n \"application/json\",\n \"text/javascript\"\n),得到了 text/html"; NSLocalizedRecoverySuggestion = "索引测试";
我正在使用这段代码;
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"Ans", @"name",
@"29", @"age",
nil];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"/" parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
NSLog(@"Success");
NSLog(@"%@",JSON);
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
NSLog(@"Failure");
];
[operation start];
[operation waitUntilFinished];
【问题讨论】:
问一下,为什么会有“[operation waitUntilFinished];”?这是需要的吗?它是阻塞调用吗?谢谢! :) 所以...在上面的代码中,您在哪里/如何实现了公认的解决方案? 【参考方案1】:默认情况下,AFJSONRequestOperation
仅接受来自服务器的“text/json”、“application/json”或“text/javascript”内容类型,但您获取的是“text/html”。
在服务器上修复会更好,但您也可以在您的应用中添加“text/html”内容类型作为可接受的内容:
[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
它对我有用,希望对你有帮助!
【讨论】:
【参考方案2】:您是否通过AFHTTPClient
发送了此 POST 请求?如果是这样,您需要为其设置操作类:
AFHTTPClient * client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost:8080"]];
// ...
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"application/json"];
// ...
// EDIT: Use AFHTTPClient's POST method
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
@"Ans", @"name",
@"29", @"age", nil];
// POST, and for GET request, you need to use |-getPath:parameters:success:failure:|
[client postPath:@"/"
parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"RESPONSE: %@", responseObject);
// ...
failure:^(AFHTTPRequestOperation *operation, NSError *error)
if (error)
NSLog(@"%@", [error localizedDescription]);
// ...
【讨论】:
是的;我正在使用 AFHTTPClient,并且还设置了提到的类;请查看我的代码,我刚刚编辑了我的问题; @Ans AFHTTPClient 有一个-postPath:parameters:success:
方法。你试过了吗?
感谢您的回复;我试过你的代码,但现在成功和失败块都没有被执行;
是的,我做到了; (:我刚刚复制了您使用 [client postPath:parameters: etc ... 发送请求的方式
@Ans 这很奇怪..我以这种方式成功发出 POST 请求。我认为其他地方可能存在问题(在您的服务器上,或..)。 :S【参考方案3】:
在此代码中设置您的值并检查它是否适合您
AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:[NSURL URLWithString:kBASEURL]];
NSString *_path = [NSString stringWithFormat:@"groups/"];
_path = [_path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%s %@",__PRETTY_FUNCTION__,_path);
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
path:_path
parameters:postParams];
[httpClient release];
AFJSONRequestOperation *operation = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
if ([JSON isKindOfClass:[NSArray class]] || [JSON isKindOfClass:[NSDictionary class]])
completed(JSON);
else
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
NSLog(@" response %@ \n error %@ \n JSON %@",response,error,JSON);
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
errored(error);
];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
【讨论】:
这里 kBASEURL 想xyz.com/api 和 groups/ 是一个 api 端点对吗?嗯..好吧,我试过了,但是当它发出呼叫时,什么也没有发生;不确定实际发生了什么;即使我的网址格式不正确,altest 在失败块等中抛出错误等; 我把我的基本 url 放在 kBASEURL 的位置,然后用我的 api 端点替换你的 groups/;可以吗? 是的……没关系,伙计,还有一件事;离开这些东西先尝试一个简单的事情......如果你有谷歌浏览器安装XHRPoster并在那里填写/放置必要的数据并点击api......并验证这些东西......如果在那里被接受那么它应该不是问题在这里,但如果不是,那肯定是您的服务器端的问题。 我必须将我的一个项目表单 ASIHttp 发送到 AFNetworking,但被卡在 post request 中;它在我的一个 GET 调用中运行良好; 用 Google XHRPoster 试试,并根据 api 所需的必要数据验证响应...如果它在那里工作,它必须在这里工作......你可以从这里获得 XHR 海报chrome.google.com/webstore/detail/…以上是关于AFNetworking 和 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章