AFNetworking 2.0使用URL参数发送发布请求

bar*_*dog 8 objective-c ios afnetworking-2

如何使用URL中的所有参数发送POST带有AFNetworking2.0 的请求,如下所示:

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);
}];
Run Code Online (Sandbox Code Playgroud)

但它没有用,我得到了这个错误:

Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: bad request (400)

bol*_*nad 22

之前的最佳答案是让后端更改并接受正文中的参数.这是首选的方法,但有时我们中的一些人使用后端无法改变,所以我提供这个解决方案....

在类AFURLRequestSerialization有一个叫做HTTPMethodsEncodingParametersInURI特性,那就是都包含了允许使用PARAMS URI中的HTTP方法的NSSet中GET,HEADDELETE默认.

您可以覆盖它并包含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....]];
Run Code Online (Sandbox Code Playgroud)

这应该允许在POST的uri中发送参数.为我工作,希望它能帮助别人


wak*_*aki 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];
    }];
Run Code Online (Sandbox Code Playgroud)

尝试这个