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

AFNetworking 2.0 POST 请求的问题

obj-c AFNetworking 2.0 POST 请求不起作用

AFNetworking 2.0:是不是可以将纯 json 放入 POST 请求的正文中?

使用 AFNetworking 2.0 如何使用 JSON 测试我的 POST 请求的大小?

用于 POST 的 AFNetworking 2.0 自定义标头

AFNetworking 2.0 多部分请求正文空白