iOS:在这种情况下,put请求如何工作?

时间:2014-10-20 20:21:32

标签: ios objective-c http afnetworking put

我正在使用AFNetworking并试图弄清楚如何正确使用PUT请求。这就是API文档给我的东西(只是一个简单的例子)。

curl -X PUT -d '{"problem":[{"problem":"text"}]}' "https://api.website.com/form?apiKey={apiKey}"

Params是

'{"problem":[{"problem":"text"}]}',而urlStr为https://api.website.com/form?apiKey={apiKey}如果您需要更多信息,请告知我们。

这是我的执行请求。

- (void) executePutRequest : (NSString *) url params : (NSString *) params
 {
NSString *urlStr = [NSString stringWithFormat:@"%@?apikey=%@", url,apiKey];
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:
          NSASCIIStringEncoding];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager PUT:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    [operation setUserInfo:userinfo];
    SBJsonParser *jsonparser = [SBJsonParser new];
    id result = [jsonparser objectWithString:[operation responseString]];
    if ( self.delegate != nil && [self.delegate respondsToSelector:finishSelector] ) {
        [self.delegate performSelector:finishSelector withObject:result];
    }

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    [operation setUserInfo:userinfo];
    if ( self.delegate != nil && [self.delegate respondsToSelector:failSelector] ) {
        [self.delegate performSelector:failSelector withObject:[operation error]];
    }
}];
  }

我做错了什么?我收到400错误(错误的请求)。这就是我的日志的样子。

Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)" UserInfo=0x7aee9a40 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7aeea400>

1 个答案:

答案 0 :(得分:2)

AFNetworking旨在为您完成一些冗余工作,包括分别序列化和反序列化服务器输出和服务器输入。您的代码暗示您也尝试手动执行,这是不正确的。

  • 您已params设为NSString *。只需将它预期的NSDictionary *传递给它即可。例如NSDictionary *params = @{ @"problem": @[ @{ @"problem": @"text" }]};,来自您的例子。

  • 如果输入成功块,则应将responseObject反序列化为您已配置的格式。 IIRC,默认的响应格式是JSON - 但要查找它。您不需要进一步处理响应 - 它已经为您完成了。例如,如果JSON主体类似{ "cat": { "says": "meow" } },那么只需将对象转换为NSDictionary;例如NSDictionary *catDict = (NSDictionary *)responseObject;

您或您的团队是否编写了网络服务?您知道预期的请求和响应格式是什么吗?

如果你必须进一步配置请求和响应序列化程序,你可以在你的经理的构造函数中这样做(所以将经理子类化,然后制作你自己的)。例如,

[self setRequestSerializer:[AFJSONRequestSerializer serializer]];
[self setResponseSerializer:[AFJSONResponseSerializer serializer]];

...将配置客户端将JSON发送到服务器,并期望从服务器返回JSON。