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 请求的主要内容,如果未能解决你的问题,请参考以下文章

[AFN]AFNetworking错误总结

iOS AFN POST  提交表单后台接收不到

AFNetWorking 网络请求转载

无法使用 AFNetworking Objective-C 获取 XML 响应的内部节点

AFN3.0封装

AFN请求问题