如何使用 AFHTTPRequestOperation 在表单字段中包含 JSON

Posted

技术标签:

【中文标题】如何使用 AFHTTPRequestOperation 在表单字段中包含 JSON【英文标题】:How to include JSON in the form field using AFHTTPRequestOperation 【发布时间】:2014-03-19 13:46:46 【问题描述】:

我正在尝试使用 AFHTTPRequestOperation(通过 AFHTTPRequestOperationManager)将一些信息(例如,“foo = bar”)传输到期望 JSON 的后端,使用如下设置:

- (void) postTest 
NSString *completePath = @"https://httpbin.org/post";
NSDictionary *dataToJSONfy = @@"foo":@"bar";
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject: dataToJSONfy options:kNilOptions error:&error];

NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:completePath parameters:nil];
request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];

AFHTTPRequestOperation *operation =
[self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id JSON) 
    NSLog(@"... success! %@", JSON);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"... failure! Error: %@", error);
];

[self.operationQueue addOperation:operation];

如下图所示


args =     
;
data = "\"foo\":\"bar\"";
files =     
;
form =     
;
headers =     
    [...]
;
json =     
    foo = bar;
;
origin = [...];
url = "http://httpbin.org/post";

问题:为了将我的信息(“foo = bar;”)包含在正文的“form =”部分而不是“json =”位中,我需要进行哪些更改?

【问题讨论】:

不要休息。所以你不想包含 json 而是 formdata 吗? 我想在帖子中包含有效的 JSON(例如之前存储的一些服务器响应),但根据 API 规范,所有内容都应该位于“form = ;”下部分。所以我想我想要 JSON 作为 formdata。 给你写了一个答案..只是不要把json放在body里,而是用一个字符串作为中间 【参考方案1】:

我想在帖子中包含有效的 JSON(例如,之前存储的一些服务器响应),但根据 API 规范,所有内容都应该位于“form = ;”下部分。所以我想我想要 JSON 作为 formdata。

NSData *jsonData = [NSJSONSerialization dataWithJSONObject: dataToJSONfy options:kNilOptions error:&error];

//new!
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *bodyString = [NSString stringWithFormat:@"'Form': '%@', jsonString]; //! not 100% what you want. I stick with valid JSON here
NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:completePath parameters:nil];
request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setHTTPBody:bodyData]; //!

【讨论】:

我没有得到这个问题,但这不能工作,因为正文不是 JSON (bodyData),但 Content-Type 假装它是。它也不是已知的 MIME 类型。 这是他想要的。全部 ;) 我知道它不是有效的 json 如果是forma数据,Content-Type应该是application/x-www-form-urlencoded(或者省略,因为这是默认值),并且JSON参数需要正确编码(这很难得到对)。不过我猜,服务端可以接受JSON,只是想知道怎么组合。 如果它实际上类似于form=<some JSON>,那么这将需要一个自定义的 Content-Type。也许是 JSON:"form": <JSON>? 感谢大家的努力和耐心等待!我们最终按照这里的建议做了很多事情,创建了一个 [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] 并将其添加到 Content-Type application/x-www-form-urlencoded 的请求正文中,最终将其留给后端重新创建 JSON。将其标记为正确,因为这似乎是最可行的解决方法,这可能是一个非常愚蠢的问题。【参考方案2】:

首先你需要在 postTest 方法之后声明 nsdictionary 块

    __block NSDictionary *dict=[NSDictionary alloc] init];

在成功块中你应该使用

dict=[NSJSONSerlization JSONObjectWithData:JSON options:NSJSONReadingAllowFragments error:nil];
NSLog(@"... success! %@", dict);

【讨论】:

以上是关于如何使用 AFHTTPRequestOperation 在表单字段中包含 JSON的主要内容,如果未能解决你的问题,请参考以下文章

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等