如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]