iOS--WKWebView加载Post请求丢失body的解决方式

iOS--WKWebView加载Post请求丢失body的解决方式,第1张

WKWebView通过loadrequest方法加载Post请求会丢失请求体(body)中的内容,进而导致服务器拿不到body中的内容的问题的发生。这个问题的产生主要是因为WKWebView的网络请求的进程与APP不是同一困返雹个进程,所以网络请求的过程是这样的:由APP所在的进程发起request,然后通过IPC通信(进程间通信)将请求的相关信息(请求头、请求行、请求体等)传递给webkit网络线进程接收包装,进行数据的HTTP请求,最终再进行IPC的通信回传给APP所在的进程的。这里如果发起的request请求是post请汪帆求的话,由于要进行IPC数据传递,传递的请求体body中根据系统调度,将其舍弃,最终在WKWebView网络进程接受的时候请求体body中的内容变成了空,导致此种情况下的服务器获取不到请求体,导致问题的产生。(摘自链接: 关于WKWebView的post请求丢失body问题的解决方案 - )

上面的问题通过测试发现在iOS11之后已修复,但是App还要支持iOS11之前的系统,所以还是需要解决这个问题。

创建一个form表单,将需要post的数据填到表世升单,模拟form表单提交实现数据传输。

新建一个头文件 WKWebViewFormDefine.h,里面定义了一个宏:

上面定义了一个my_post方法,需要传入两个参数:path和params,path是请求的URL的字符串,path是放到body中的参数,函数实现创建form表单并填入params的参数,最后commit提交,实现post请求。这个宏网上基本都能找到,但是实际使用中,当params中的汉字会出现乱码,上面已经补充, 给from设置 accept-charset 问题解决。

1、请求的url

2、需要传入的参数字典

3、将参数字典转成Json字符串

4、包装成需要执行的 js 字符串,注意  my_post 是宏定义中的方法名,POST_JS是宏定义名称,需要一一对应!

5、执行js

到这里基本实现完成了。

上面实现中用到的函数

c#我不太懂啊。我用的是php的curl方法模拟登陆的,我有点记不清了,不过request payload好像不是问题的关键,造成post失败的原因应该是ajax进行传输时缺少头文件,我最后的解决方法是加了头文件,里面最关键源盯的就是下面这两个。你看下你的抓包数据有没有这两个,有的雹锋和话在你post的时候加上这两个头文件,保险起见连其他一些简单的头信息也加上。

'X-MicrosoftAjax:Delta=true',

'X-Requested-With:XMLHttpRequest'

注:Accept-Encoding:gzip,deflate 这个不用加,gzip会让返回基轿值变成乱码的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8149187.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存