苹果IOS客户端POST数据为空,安卓正常处理办法

ios客户端post数据为空

最近项目服务器由Windows平台迁移到Linux平台后,发现苹果IOS客户端POST提交数据为空,无法上传视频,但是同样的接口,安卓客户端正常。以下是整个问题的排查过程。

首先确认IOS端上传插件是否用AF或AFN。参考下面方法解决。

可能导致该问题的原因一:缺少请求头。

我们知道在普通网页Form表单提交数据时,需要给表单添加enctype ="multipart/form-data",同样苹果IOS端POST上传文件也需要请求头。

  1. manager.requestSerializer setValue:@"text/xml;charset=utf-8" forHTTPHeaderField:@"Content-Type"

可能导致该问题的原因二:返回JSON格式错误。

通过AF提交数据已经做过解析,此时需要检查后台返回JSON格式是否有误,如果JSON格式不规范,可以协商后台进行修改。

可能导致该问题的原因三:数据协议不正确。

导致该问题出现的原因很可能是服务器采用了数据加密传输,如:https。此时可检查http上传文件是否正常,如果http上传文件正常,那么协商服务器给客户端cer证书。

附修改过AFN上传插件https提交数据单例源码。

  1. + (AFHTTPSessionManager *)sharedAFManager
  2. {
  3.     static AFHTTPSessionManager *manager = nil;
  4.     static dispatch_once_t onceToken;
  5.     dispatch_once(&onceToken, ^{
  6.         manager = [AFHTTPSessionManager manager];
  7.         /*! 设置请求超时时间 */
  8.         manager.requestSerializer.timeoutInterval = 30;
  9.         /*! 打开状态栏的等待菊花 */
  10.         [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
  11.         /*! 设置相应的缓存策略:此处选择不用加载也可以使用自动缓存【注:只有get方法才能用此缓存策略,NSURLRequestReturnCacheDataDontLoad】 */
  12.         manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
  13.         /*! 设置返回数据类型为 json, 分别设置请求以及相应的序列化器 */
  14.         /*! 
  15.          根据服务器的设定不同还可以设置:
  16.          json:[AFJSONResponseSerializer serializer](常用)
  17.          http:[AFHTTPResponseSerializer serializer]
  18.          */
  19.         AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
  20.         /*! 这里是去掉了键值对里空对象的键值 */
  21.         response.removesKeysWithNullValues = YES;
  22.         manager.responseSerializer = response;
  23.         /* 设置请求服务器数类型式为 json */
  24.         /*! 根据服务器的设定不同还可以设置 [AFJSONRequestSerializer serializer](常用) */
  25.         AFJSONRequestSerializer *request = [AFJSONRequestSerializer serializer];
  26.         manager.requestSerializer = request;
  27.         /*! 设置apikey ------类似于自己应用中的tokken---此处仅仅作为测试使用*/
  28.         //        [manager.requestSerializer setValue:apikey forHTTPHeaderField:@"apikey"];
  29.         /*! 复杂的参数类型 需要使用json传值-设置请求内容的类型*/
  30.         //        [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  31.         /*! 设置响应数据的基本类型 */
  32.         manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css",@"text/xml",@"text/plain", @"application/javascript", @"image/*", nil];
  33.         /*! https 参数配置 */
  34.         /*! 
  35.          采用默认的defaultPolicy就可以了. AFN默认的securityPolicy就是它, 不必另写代码. AFSecurityPolicy类中会调用苹果security.framework的机制去自行验证本次请求服务端放回的证书是否是经过正规签名. 
  36.          */
  37.         AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
  38.         securityPolicy.allowInvalidCertificates = YES;
  39.         securityPolicy.validatesDomainName = NO;
  40.         manager.securityPolicy = securityPolicy;
  41.         /*! 自定义的CA证书配置如下: */
  42.         /*! 自定义security policy, 先前确保你的自定义CA证书已放入工程Bundle */
  43.         /*! 
  44.          https://api.github.com网址的证书实际上是正规CADigiCert签发的, 这里把Charles的CA根证书导入系统并设为信任后, 把Charles设为该网址的SSL Proxy (相当于"中间人"), 这样通过代理访问服务器返回将是由Charles伪CA签发的证书.
  45.           */
  46. //        NSSet <NSData *> *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]];
  47. //        AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet];
  48. //        policy.allowInvalidCertificates = YES;
  49. //        manager.securityPolicy = policy;
  50.         /*! 如果服务端使用的是正规CA签发的证书, 那么以下几行就可去掉: */
  51. //        NSSet <NSData *> *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]];
  52. //        AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet];
  53. //        policy.allowInvalidCertificates = YES;
  54. //        manager.securityPolicy = policy;
  55.         /*post 请求 服务器端接收数据为空 是因为要初始化下面这个方法*/
  56.         manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  57.     });
  58.     return manager;
  59. }

在POST数据时进行方法初始化。

  1. manager.requestSerializer = [AFHTTPRequestSerializer serializer];

因为波波本身不是做IOS开发的,所以在此特别向提供解决方案的春蕾兄弟表示感谢。

 

波波
你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!