如何使用POST
2.0发送AFNetworking
请求以及网址中的所有参数,如下所示:
http://www.myserver.com?api_key=something&lat=2.4&radius=100
现在我有:
NSString* query = @"http://example.com?name=param&date=param";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{};
[manager POST:query parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
但它没有用,我收到了这个错误:
Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: bad request (400)
答案 0 :(得分:21)
之前的最佳答案是让后端更改并接受正文中的参数。这是首选的方法,但有时我们中的一些人会使用无法改变的后端,所以我提供了这个解决方案......
在AFURLRequestSerialization类中有一个名为HTTPMethodsEncodingParametersInURI的属性,它是一个NSSet,它包含允许在uri GET
,HEAD
和DELETE
中使用params的http方法默认情况下。
您可以覆盖它并包含POST。
在AFURLRequestSerialization.m中的行462有一个if语句,用于检查self.HTTPMethodsEncodingParametersInURI属性是否包含POST。如果它没有(因为它没有默认),它会将参数放在正文中。
您可以注释掉该id语句以进行快速测试。
为了让它工作,我建议覆盖HTTPMethodsEncodingParametersInURI属性。
设置AFHTTPSessionManager时,它应该如下所示......
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:self.httpBaseUrl]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithArray:@[@"POST", @"GET", @"HEAD", whatever other http methods you need here....]];
这应该允许在POST的uri中发送参数。为我工作,希望它能帮助别人
答案 1 :(得分:3)
#import "AFNetworking.h"
...
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"param1": value1,
@"param2": value};
manager.responseSerializer = [AFJSONResponseSerializer serializer]; // if response JSON format
[manager POST:@"http://domain.com/backend.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}];
试试这个
答案 2 :(得分:1)
我和你有同样的问题。
其他人的答案似乎是准确的。
错误原因是:
当您使用http:www.baidu.com/api?id = 1& name =我等参数初始化NSUrl时,它需要您使用utf-8对urlString进行编码
如:
//解决奇葩需求:?请求方式为交时,URL带ID = 1之类主要原因是URL带中文的时候URL初始化失败 URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
希望能帮到你!
答案 3 :(得分:0)
你可以尝试一下。
NSString* apiURL = @"http://example.com"
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:apiURL]];
manager.responseSerializer = [AFJSONResponseSerializer serilizer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
NSDictionary *parameters = @{@"name":@"John",@"date":"27/12/2013"};
AFHTTPRequestOperation *apiRequest = [manager POST:@"" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog@"response ---%@,responseObject";
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
[apiRequest start];
答案 4 :(得分:0)
我能够通过创建这样的字符串来实现这一点:
NSString * relativeURL = [NSString stringWithFormat:@ “?/回报/提交deviceUUID =%@&安培; rewardID =%@”,[[客户端 sharedInstance] deviceUUID],self.rewardID];
然后将其作为查询传递。我必须按如下方式设置requestSerializer和responseSerializer:
client.requestSerializer = [AFJSONRequestSerializer序列化程序];
client.responseSerializer = [AFHTTPResponseSerializer序列化程序];
答案 5 :(得分:0)
一旦我离开manager.requestSerializer属性并让它成为默认属性(AFHTTPRequestSerializer),我就为我工作了。 我正在POST的服务,似乎期待UTF8编码的身体参数。