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

Posted

技术标签:

【中文标题】iOS:在这种情况下 put 请求如何工作?【英文标题】:iOS: How would a put request work in this scenario? 【发布时间】:2014-10-20 20:21:31 【问题描述】:

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

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

参数是

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

这是我正在执行的 put 请求。

- (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】:

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

您已将params 设置为NSString *。只需将它期望的NSDictionary * 传递给它。例如NSDictionary *params = @ @"problem": @[ @ @"problem": @"text" ];,来自你的例子。

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

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

如果您必须进一步配置请求和响应序列化程序,您可以在管理器的构造函数中执行此操作(因此子类化管理器,并自己创建)。例如,

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

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

【讨论】:

以上是关于iOS:在这种情况下 put 请求如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

错误:CON laravel恩axios.put“请求,状态码500失败”()

iOS:如何正确发送 put 请求到服务器

iOS - 如何区分 UI 和单元测试,以及如何在这种具体情况下使用它们?

如何在不使用 CURL 的情况下运行 HTTP 请求

如何在这种情况下避免同步?

通用 TS 在这种情况下如何工作