AFNetworkinghttp请求报文格式格式问题吗

18:59 提问
请教AFNetworking传递数组的问题
现在有一个参数name是一个数组,要如何才能通过post方式提交到后台呢?按照官方文档的去写的但是总是说json格式不对。
按赞数排序
感谢回答,最后的解决方法如下,最终还是改了源码,不知道为什么官方文档里的使用方法和使用不一样,
修改AFURLRequestSerialization.m,修改方法如下:
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@", key], nestedValue)];//原生:%@[]
如果是提示 json 格式不对,那应该是你写的 json 字符写错了,可以使用对象转 json 的方法来做,如果最后还是不成功,那可能是你的后台不支持 json 格式,那就全部 base64 一下,当做字符串传递吧
iOS-AFNetworking POST参数NSArray
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
其他相关推荐16:11 提问
AFNetworking 怎样上传数据? 怎样上传模拟表单
AFNetworking 怎样上传数据?
怎样上传模拟表单?
求大神代码提示
按赞数排序
和取数据差不多的
首先定义一个字典,用来存放参数
NSDictionary* params = [NSDictionary dictionary];
params[@"属性"] = 值;
上传字段数据:
//创建请求管理类
AFHTTPRequestOperationManager* mgr = [AFHTTPRequestOperationManager manager];
//发送请求
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//成功回调
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//失败回调
上传文件数据(事先将文件转化为二进制data):
//创建请求管理类
AFHTTPRequestOperationManager* mgr = [AFHTTPRequestOperationManager manager];
//发送请求
[mgr POST:url parameters:params constructingBodyWithBlock:^(id&AFMultipartFormData& totalformData) {
[totalformData appendPartWithFileData:formData.data name:formData.name fileName:formData.fileName mimeType:formData.mimeType];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
//成功回调
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//失败回调
谢谢,祝你越活越年轻;
上传文件数据具体该怎么实现呢
拿到沙盒路径下的文件后具体怎么呈现呢,求解,谢谢
其他相关推荐使用 AFNetworking3.0请求时如何获取响应头文件 - 简书
使用 AFNetworking3.0请求时如何获取响应头文件
一直都是在给服务器端发送请求的时候可能会出现设置头文件的情况,但这次获取HTTP 返回的头文件,着实让我纠结一番,但最终还是实现了,总结一下。(PS:其实最后方法很简单,只是分享一下纠结过程)
先看一下使用 AFNetworking3.0是如何获取数据的。
AFHTTPSessionManager *httpsManager = [AFHTTPSessionManager manager];
httpsManager.requestSerializer = [AFHTTPRequestSerializer serializer];
httpsManager.responseSerializer = [AFHTTPResponseSerializer serializer];
AFSecurityPolicy *security = [AFSecurityPolicy defaultPolicy];
security.allowInvalidCertificates = YES;
security.validatesDomainName = NO;
httpsManager.securityPolicy =
[httpsManager POST:ZCFormatURL(@"/paydone") parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
分析一下返回的数据failure 时:
NSURLSessionDataTask * _Nullable task 和请求有关的一些描述
NSError * _Nonnull error 网络请求不通等错误描述success 时:
NSURLSessionDataTask * _Nonnull task 和请求有关的一些描述
_Nullable responseObject AFNetworking格式化之后的结果,与AFHTTPSessionManager的responseSerializer相对应
很明显,我们所要的数据最有可能是在 task 中,所以那就看一下NSURLSessionDataTask类吧,
* An NSURLSessionDataTask does not provide any additional
* functionality over an NSURLSessionTask and its presence is merely
* to provide lexical differentiation from download and upload tasks.
@interface NSURLSessionDataTask : NSURLSessionTask
发现它仅仅只是继承自NSURLSessionTask,并没有自己的属性方法,好,那就接着看父类NSURLSessionTask父类属性倒是不少(太长了,代码不放这了)。最有可能包含我们所要信息应该就是response属性了
@property (nullable, readonly, copy) NSURLResponse *
/* may be nil if no response has been received */
好,那就接着看NSURLResponse,发现他的属性方法中没有能获取头文件的。倒是他的子类中有一个属性挺顺眼的。
@method allHeaderFields
@abstract Returns a dictionary containing all the HTTP header fields
of the receiver.
@discussion By examining this header dictionary, clients can see
the "raw" header information which was reported to the protocol
implementation by the HTTP server. This may be of use to
sophisticated or special-purpose HTTP clients.
@result A dictionary containing all the HTTP header fields of the
@property (readonly, copy) NSDictionary *allHeaderF
赶紧回去判定一下返回的task.response是不是NSURLResponse的子类
if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
NSLog(@"The return class is subclass %@",NSStringFromClass([NSHTTPURLResponse class]));
NSLog(@"The return class is not subclass %@",NSStringFromClass([NSHTTPURLResponse class]));
打印日志: 11:29:52.547 demo[535:106586] The return class is subclass NSHTTPURLResponse
果真是,这下就好办多了,直接强转,获取数据就好了
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.
NSDictionary *allHeaders = response.allHeaderF
最终方法就是这么这么的简单,纠结了好大会,但最终还是有点收获,记录一下。。。
最近在读 大冰 的《乖,摸摸头》,用里面的一句话来结尾。
源静则流清
本固则丰茂
提刀纵身上马,杀进漫天黄沙AFNetworking的Post失败及requestSerializer的正确使用
作者:W_C__L
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了IOS
AFNetworking的Post失败及requestSerializer的正确使用的相关资料,需要的朋友可以参考下
IOS& AFNetworking的Post失败及requestSerializer的正确使用
最近接手一个项目,因为之前的项目里面POST请求用的是ASI的,我就想着给替换成AFNetworking,但是在替换过程中遇到了一个大坑,解决了半天才发现是一个小问题,下面将我的问题给大家分享一下:
错误描述和发现过程
Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
看了错误描述后,根据它的描述是因为返回的json数据格式不对,不是json的,我就去修改AFNetworking的responseSerializer返回的序列化器,发现怎么改怎么不对,各种尝试无果之后,我打印了一下元数据,发现返回的居然是Html格式的消息,消息内容大概是服务器请求失败了,好吧,搞了半天是我请求错误了。我验证半天发现参数没什么问题啊,于是我就打印了一下用ASI请求body的数据发现是这样子的:mid=10&method=userInfo&dateInt=,我再打印了一下我用AFNetworking拼接成的body的数据格式居然是这样子的{"mid":"11","method":"userInfo","dateInt":""},好吧,现在我知道是哪里有问题了,因为之前传的参数都是json格式的所以没问题,谁知道这个服务器接受的数据不是json格式的,所以请求失败了。那我就需要修改AFNetworking的requestSerializer了。
requestSerializer
关于 requestSerializer它就是AFNetworking参数编码的序列化器,它一共有三种编码格式:
AFHTTPRequestSerializer:第一种是普通的http的编码格式也就是mid=10&method=userInfo&dateInt=,这种格式的。
AFJSONRequestSerializer:第二种也是json编码格式的,也就是编码成{"mid":"11","method":"userInfo","dateInt":""}
AFPropertyListRequestSerializer:第三种没用过,但是看介绍接编码成pislt格式的参数
看了上面的介绍应该能明白到底该如何修改了,下面贴上我的修改过程。
_sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL];
//拼接参数的序列化器,使用的错误的序列化器
_sharedCBClient.requestSerializer = [AFJSONRequestSerializer serializer];
//返回数据的序列化器
_sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
_sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL];
//拼接参数的序列化器,使用的正确的序列化器
_sharedCBClient.requestSerializer = [AFHTTPRequestSerializer serializer];
//返回数据的序列化器
_sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
_sharedCBClient = [[AFAppCBNetAPIClient alloc] initWithBaseURL:baseURL];
//拼接参数的序列化器,使用的正确的序列化器
_sharedCBClient.requestSerializer = [AFHTTPRequestSerializer serializer];
//返回数据的序列化器
_sharedCBClient.responseSerializer = [AFJSONResponseSerializer serializer];
到这里我的问题也就解决了,一个小小的问题困扰了很久真是不应该,以后应该多跟后台沟通沟通,要不出错了也不知道错在哪里,
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 ajax请求格式 的文章

 

随机推荐