AFNetworking 2.0 POST 请求的问题
Posted
技术标签:
【中文标题】AFNetworking 2.0 POST 请求的问题【英文标题】:Problems with AFNetworking 2.0 POST Request 【发布时间】:2013-11-03 23:38:39 【问题描述】:我是 ios 和 AFNetworking 的新手。我已经习惯了 Titanium 以及使用类似于 javascript 中的 xhr 的模型发布和获取数据的非常简单的方法。我向我的服务器发送一个 Post 请求并取回 JSON。它在 Titanium 中完美运行,但我花了很长时间让它在本地运行。
在研究了 Titanium 的后端之后,他们似乎正在使用 ASI,我觉得这很有趣。现在看来 AFNetworking 是替代方案,因为 ASI 不再更新。但是,当我在下面发送请求时,它会收到 text/html 响应而不是 JSON 响应。我猜这是因为参数以及它们的发送方式。
在另一个 *** 问题上,该人需要向服务器提供标准发布变量,而服务器以 JSON 响应,这正是我需要做的。建议是在您的 AFHTTPClient 中将“parameterEncoding 设置为 AFFormURLParameterEncoding”,但我不知道该怎么做。如果有人可以帮助我解决这个问题,我将永远感激不尽。如果这有助于任何人弄清楚这一点,我可以提供实际的邮寄地址和虚拟用户/通行证。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @@"username": @"dummyusername",@"password":@"dummypassword";
NSString *URLString = @"https://www.webaddress.com/index.php?ACT=71";
[manager POST:URLString parameters:parameters constructingBodyWithBlock:^( id<AFMultipartFormData> parameters ) success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"JSON: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
【问题讨论】:
有一篇有趣的文章here关于转换到AFNetworking 2.0。在 AFHTTPRequestOperationManager 中发送参数的默认方法是 JSON,而不是 x-www-form-urlencoded 样式。但是我不确定如何更改方法。 【参考方案1】:在 AFNetworking 2.1 中,您可以创建一个 AFHTTPRequestOperationManager
作为实例变量,在视图控制器的 viewDidLoad
中初始化它(或对象中的设置方法),设置请求序列化程序,然后通过实例变量。
工作示例:
// Creation
-(void)setup
url = [NSURL URLWithString:kMediaURLString];
manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
...
-(void)makeRequestWithObject:(id)obj
// Create your parameters
NSDictionary *params = @ @"someParameter" : obj ;
// Create a path (relative to your manager's baseURL)
NSString *urlString = [NSString stringWithFormat:kCreatePath, postPath];
// Post the request to urlString with params, handle success or failure
[manager POST:urlString
parameters:params
success:^(AFHTTPRequestOperation *operation, id success)
// Do stuff on success
failure:^(AFHTTPRequestOperation *operation, NSError *error)
// Do stuff on failure
];
【讨论】:
这很好用。那里的服务器端也有问题。表达式引擎在 JSON 响应输出后试图修改标头信息,这导致 PHP 错误输出为 text/html 并导致应用程序中的错误响应。我能够在服务器上解决这个问题,现在效果很好!再次感谢 *** 上的每一个人!【参考方案2】:我没有像您那样使用 AFNetworking,但我猜您的问题与服务器不知道它应该发送 JSON 响应有关。您可以将“接受”标头更改为“应用程序/json”。
看看this AFNetworking的教程,对我帮助很大:)
【讨论】:
【参考方案3】:你可以像这样使用 AFNetworking。
AFHTTPClient *httpClient = [[AFHTTPClient alloc] init];
NSDictionary *parameter = @@"username":@"dummyusername", @"password":@"dummypassword";
[httpClient setParameterEncoding:AFJSONParameterEncoding];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient postPath:@"https://www.webaddress.com/index.php?ACT=71" parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject)
// Print the response body in text
BOOL *success = [[responseObject objectForKey:@"success"] boolValue];
NSLog(@"Response: %@",responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
[self handleConnectionError:error];
];
【讨论】:
这是使用 AFNetworking 2.0 吗?如果是,httpClient 是 AFHTTPRequestOperationManager 吗?以上是关于AFNetworking 2.0 POST 请求的问题的主要内容,如果未能解决你的问题,请参考以下文章
obj-c AFNetworking 2.0 POST 请求不起作用
AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?
使用 AFNetworking 2.0 如何使用 JSON 测试我的 POST 请求的大小?