请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking
Posted
技术标签:
【中文标题】请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking【英文标题】:POST JSON string in request body (not in URL-Form-Encoded Request) AFNetworking 【发布时间】:2015-05-04 18:31:00 【问题描述】:我想使用 AFNetworking POST 请求向服务器发送 JSON 字符串。 目前我正在尝试以下代码
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSData * data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setTimeoutInterval:120];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"JSON: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
[operation start];`
什么都没有发生。代码既没有进入成功区块,也没有进入失败区块。可能是什么原因?在 AFNetworking 2 中有没有其他方法可以做到这一点。 注意:请求在 POSTMAN 上运行良好,并在 500 毫秒内返回响应。
【问题讨论】:
【参考方案1】:这是我的工作代码
NSDictionary *parameters = [NSDictionary dictionary];//set values here
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
[manager POST:@"http://example.com/api" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
//Do success code
failure:^(AFHTTPRequestOperation *operation, NSError *error)
//do failure code
];
这是配置HTTP body AFJSONRequestSerializer的函数
#pragma mark - AFURLRequestSerialization
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(id)parameters
error:(NSError *__autoreleasing *)error
NSParameterAssert(request);
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]])
return [super requestBySerializingRequest:request withParameters:parameters error:error];
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop)
if (![request valueForHTTPHeaderField:field])
[mutableRequest setValue:value forHTTPHeaderField:field];
];
if (parameters)
if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"])
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
return mutableRequest;
您正在使用 AFJSONRequestSerializer 作为请求序列化程序,这意味着您从 NSDictionary 发送 JSON 字符串作为 HTTP 正文
[mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
所以你需要做的就是从 JSON 值生成 NSDictionary,然后像上面那样调用。 无需制作 JSON 字符串。
【讨论】:
发送原始数据? 原始数据有什么关系?这很大程度上取决于 Web 服务的编写方式。 我想发送一个 JSON 字符串而不是参数(NSDictionary)。 我现在有点困惑 vichevstefan :)。我已经多次使用 AFNetworking POST 方法。现在我应该如何处理第二个和第三个代码 sn-p?我对第一个代码 sn-p 有完整的了解。我已经有一个 NSDictionary 可以转换为 JSON 字符串 2、3代码sn-p是AFNetworking如何实现请求序列化的解释。以上是关于请求正文中的 POST JSON 字符串(不在 URL-Form-Encoded 请求中) AFNetworking的主要内容,如果未能解决你的问题,请参考以下文章
如何将 json 列表传递给 Flutter 中的 http 请求(post)正文?
在 Swift 中使用 JSON 正文发出 HTTP Post 请求
如何通过 Windows 批处理脚本中的 curl 发送带有 json 正文的 POST 请求
从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题