karosLi / KKJSBridge

一站式解决 WKWebView 支持离线包,Ajax/Fetch 请求,表单请求和 Cookie 同步的问题 (基于 Ajax Hook,Fetch Hook 和 Cookie Hook)
MIT License
693 stars 120 forks source link

请求参数拼接 2 次导致连接不合法问题 #59

Closed Huiz110 closed 3 years ago

Huiz110 commented 3 years ago

H5 碰到发起 GET 请求时,请求参数重复添加 2 次,导致连接错误页面无法展示问题

image 如上图中,driverNo beginTime endTime? 都添加了 2 遍,排查后原因是 H5 发起请求时连接中直接拼接了参数,如果不直接拼接,在添加参数的方法中添加则不会有问题,这个能否优化

karosLi commented 3 years ago

你使用的是哪个方案?另外你使用的是 axios 吗?

Huiz110 commented 3 years ago

使用的是 ajax protocol hook,H5 用的是 axios

karosLi commented 3 years ago

可以提供一个测试demo吗?

Huiz110 commented 3 years ago

可以提供一个测试demo吗?

更新到 1.3.9 版本已经没有这个问题了,不过原理还没弄清楚 1.3.9 版本,没开离线缓存的情况下,没有注册 httphttpsscheme 这个请求不会被拦截到,开启离线缓存也只拼接一次参数 1.3.7 版本,这个请求一直会被拦截且拼接 2 次参数 image

Huiz110 commented 3 years ago

可以提供一个测试demo吗?

更新到 1.3.9 版本已经没有这个问题了,不过原理还没弄清楚 1.3.9 版本,没开离线缓存的情况下,没有注册 httphttpsscheme 这个请求不会被拦截到,开启离线缓存也只拼接一次参数 1.3.7 版本,这个请求一直会被拦截且拼接 2 次参数 image

这种情况下,使用 URLProtocol hook 但是没有注册 httphttpsscheme,会有什么问题吗

karosLi commented 3 years ago

不会有问题,就是不能使用离线包了

karosLi commented 3 years ago

可以提供一个测试demo吗?

更新到 1.3.9 版本已经没有这个问题了,不过原理还没弄清楚 1.3.9 版本,没开离线缓存的情况下,没有注册 httphttpsscheme 这个请求不会被拦截到,开启离线缓存也只拼接一次参数 1.3.7 版本,这个请求一直会被拦截且拼接 2 次参数 image

1.3.9会把 get 的body给清空掉,1.3.7 不会,应该是 get 在body不清除的时候,会追加到url后面

Huiz110 commented 3 years ago

OK,感谢~

Huiz110 commented 3 years ago

image 再问下这边为什么要加个弹窗呢 @karosLi

karosLi commented 3 years ago

加弹框是为了同步调用JSAPI

Huiz110 commented 3 years ago

加弹框是为了同步调用JSAPI

image 更新版本后,默认开启 cookieGetHook,时不时出现弹窗交互不太友好,这个只能通过关闭这个开关解决吗

karosLi commented 3 years ago

你们使用的是自己的WebView吗?

karosLi commented 3 years ago

// webView 中的输入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler {

    if (![self canShowPanelWithWebView:webView]) {
        completionHandler(nil);
        return;
    }

    // 处理来自 KKJSBridge 的同步调用
    if ([self handleSyncCallWithPrompt:prompt defaultText:defaultText completionHandler:completionHandler]) {
        return;
    }
}

可以在你们自己的WebView里,添加这个代码

karosLi commented 3 years ago

// webView 中的输入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler {

    if (![self canShowPanelWithWebView:webView]) {
        completionHandler(nil);
        return;
    }

    // 处理来自 KKJSBridge 的同步调用
    if ([self handleSyncCallWithPrompt:prompt defaultText:defaultText completionHandler:completionHandler]) {
        return;
    }
}

可以在你们自己的WebView里,添加这个代码

Huiz110 commented 3 years ago
// 处理来自 KKJSBridge 的同步调用
[self handleSyncCallWithPrompt:prompt defaultText:defaultText completionHandler:completionHandler]

这个里面的具体实现是什么?

karosLi commented 3 years ago

用于处理同步请求