iOS webview上的POST参数未发送到服务器

iOS webview上的POST参数未发送到服务器,ios,post,webkit,Ios,Post,Webkit,我用一些body参数发出一个简单的POST请求,构造如下: _webView = [[WKWebView alloc] initWithFrame:self.bounds configuration:[WKWebViewConfiguration new]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:<some_URI>]]; [request se

我用一些body参数发出一个简单的POST请求,构造如下:

_webView = [[WKWebView alloc] initWithFrame:self.bounds configuration:[WKWebViewConfiguration new]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:<some_URI>]];
[request setHTTPMethod:@"POST"];
NSString *paramsStr = @"someKey=someValue"
[request setHTTPBody:[paramsStr dataUsingEncoding:NSUTF8StringEncoding]];
[_webView loadRequest:request];
\u webView=[[WKWebView alloc]initWithFrame:self.bounds配置:[WKWebView配置新];
NSMutableURLRequest*请求=[NSMutableUrlRequestRequestWithURL:[NSURL URLWithString:];
[请求设置HttpMethod:@“POST”];
NSString*paramstr=@“someKey=someValue”
[request setHTTPBody:[paramsStr dataUsingEncoding:NSUTF8StringEncoding];
[_webviewloadrequest:request];
我的服务器端点从未收到任何POST参数(http正文似乎为空)

我看到过关于
WKWebView
不在导航代理中提供
POST
数据的讨论,但这些问题的用例是从webView中获取表单数据。此外,我还了解到WKWebView的bug已经被删除


我的用例非常简单,我只想从webview发出POST请求,但它仍然不起作用。我在iOS 14.4 FWIW上。关于是什么导致POST数据在服务器上不可用的任何提示?

使用JavaScript解决WKWebView无法发送POST参数的问题

在我开始之前,让我谈谈实施想法,以便大家都能理解。如果出现问题,您可能会知道错误的位置:

将包含JavaScript的POST请求的HTML代码放在项目目录中 将此包含JavaScript的POST请求的代码加载到WKWebView

加载后,使用Native调用JavaScript的POST方法并传入参数以完成请求

用于创建包含JavaScript的POST请求的HTML代码

相关代码:


//调用格式: post('URL',{“键”:“值”});
功能post(路径、参数){
var method=“post”;
var form=document.createElement(“表单”);
form.setAttribute(“方法”,method);
form.setAttribute(“动作”,路径);
for(参数中的变量键){
if(参数hasOwnProperty(键)){
var hiddenField=document.createElement(“输入”);
setAttribute(“类型”、“隐藏”);
setAttribute(“名称”,键);
setAttribute(“值”,参数[key]);
表格.appendChild(hiddenField);
}
}
文件.正文.附件(表格);
表单提交();
}
复制此代码并将其粘贴到文本编辑器中。您可以选择任何名称,例如,将其另存为:JSPOST.html,然后将其复制到项目目录。请记住选择相应的目标,并在需要时选中“复制项目”(默认情况下应选中)。此时,您可以使用此JavaScript代码发送带有参数的POST请求

通过加载本地网页,将相应的JavaScript代码加载到WKWebView中

OC代码:
//JS发送POST标志,为true时调用JS POST方法(仅当本地JS第一次加载时)
self.needLoadJSPOST=是;
//创建WKWebView
self.webView=[[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
//设置代理
self.webView.navigationDelegate=self;
//获取JS所在的路径
NSString*path=[[NSBundle mainBundle]pathForResource:@“JSPOST”类型:@“html”];
//获取html内容
NSString*html=[[NSString alloc]initWithContentsOfFile:路径编码:NSUTF8StringEncoding错误:nil];
//加载js
[self.webView loadHTMLString:html baseURL:[[NSBundle mainBundle]bundleURL]];
//将WKWebView添加到当前视图
[self.view addSubview:self.webView];
这段代码相当于将项目中的JavaScript脚本加载到WKWebView中,稍后我们将看到如何使用它。(请更改为您的文件名)

Native调用JavaScript脚本并传入参数以完成POST请求

还记得关于WKWebView和JavaScript之间交互的部分吗?现在,Native调用JavaScript。如果您忘记了,请继续查看故事:-webView:didFinishNavigation:代理表示页面已加载。让我们在这里做吧。以下代码:

OC代码:
//加载后的代理方法
-(无效)网络视图:(WKWebView*)网络视图完成导航:(WKNavigation*)导航{
//确定是否加载(仅第一次)
if(self.needLoadJSPOST){
//使用JS调用发送POST请求的方法
[self postRequestWithJS];
//将标志设置为否(以后无需加载)
self.needLoadJSPOST=否;
}
}
//调用JS发送POST请求
-(void)postRequestWithJS{
//发送POST参数
NSString*postData=@“用户名”:“aaa\”,“密码”:“123\”;
//请求页面的URL
NSString*urlStr=@”http://www.postexample.com";
//组合成调用JavaScript的字符串
NSString*jscript=[NSString stringWithFormat:@“post('%@',{%@});”,urlStr,postData];
//NSLog(@“Javascript:%@”,jscript);
//调用JS代码
[self.webView evaluateJavaScript:jscript completionHandler:^(id对象,N错误*_可为空错误){
}];
}
您可以在此处看到更多信息: