如何解决iOS webview 上的 POST 参数没有发送到服务器
我正在使用一些 body-params 发出一个简单的 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];
我的服务器端点从未收到任何 POST 参数(http-body 似乎为空)
我看过有关 WKWebView
不在导航委托中提供 POST
数据的讨论,但这些问题的用例是从 webView 中获取表单数据。此外,我读到 WKWebView 的错误是 fixed。
我的用例很简单,我只想从 webview 发出一个 POST 请求,但它仍然不起作用。我在 iOS 14.4 FWIW 上。关于什么可能导致 POST 数据在服务器上不可用的任何提示?
解决方法
使用JavaScript解决WKWebView无法发送POST参数的问题
在开始之前,先说一下实现思路,让大家看明白。如果出现问题,您可以知道错误的地方:
将包含 JavaScript 的 POST 请求的 HTML 代码放在项目目录中 将此包含 JavaScript 的 POST 请求的代码加载到 WKWebView
加载后使用Native调用JavaScript的POST方法并传入参数完成请求
用于创建包含 JavaScript 的 POST 请求的 HTML 代码
相关代码:
<html>
<head>
<script>
//调用格式: post('URL',{"key": "value"});
function post(path,params) {
var method = "post";
var form = document.createElement("form");
form.setAttribute("method",method);
form.setAttribute("action",path);
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type","hidden");
hiddenField.setAttribute("name",key);
hiddenField.setAttribute("value",params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
}
</script>
</head>
<body>
</body>
</html>
复制此代码并将其粘贴到文本编辑器中。您可以选择任意名称,例如,另存为:JSPOST.html,然后将其复制到项目目录中。记得选择对应的Target,需要时勾选Copy items(默认应该勾选)。这时候就可以使用这段 JavaScript 代码来发送带参数的 POST 请求了。
通过加载本地网页将相应的JavaScript代码加载到WKWebView中
OC Code:
// JS sends the POST Flag,when it is true,it will call the JS POST method (only when the local JS is loaded for the first time)
self.needLoadJSPOST = YES;
// Create WKWebView
self.webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
//Set up proxy
self.webView.navigationDelegate = self;
// Get the path where JS is located
NSString *path = [[NSBundle mainBundle] pathForResource:@"JSPOST" ofType:@"html"];
// Get html content
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// load js
[self.webView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]];
// Add WKWebView to the current View
[self.view addSubview:self.webView];
这段代码相当于将项目中的JavaScript脚本加载到WKWebView中,后面会看到如何使用。 (请改成你的文件名)
Native 调用 JavaScript 脚本并传入参数完成 POST 请求
还记得 WKWebView 和 JavaScript 之间的交互部分吗?现在 Native 调用 JavaScript。如果您忘记了,请继续查看故事:-webView:didFinishNavigation:代理表示页面已加载。让我们在这里做。以下代码:
OC Code:
// Proxy method after loading
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
// Determine whether to load (only for the first time)
if (self.needLoadJSPOST) {
// Call the method of sending POST request using JS
[self postRequestWithJS];
// Set Flag to NO (you don’t need to load it later)
self.needLoadJSPOST = NO;
}
}
// Call JS to send POST request
- (void)postRequestWithJS {
// Send POST parameters
NSString *postData = @"\"username\":\"aaa\",\"password\":\"123\"";
// URL of the requested page
NSString *urlStr = @"http://www.postexample.com";
// Assembled into a string that calls JavaScript
NSString *jscript = [NSString stringWithFormat:@"post('%@',{%@});",urlStr,postData];
// NSLog(@"Javascript: %@",jscript);
// Call JS code
[self.webView evaluateJavaScript:jscript completionHandler:^(id object,NSError * _Nullable error) {
}];
}
您可以在此处查看更多信息:http://www.qw021.com/article-22.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。