【问题标题】:How can I get the JSON response of a POST request in a WebView?如何在 WebView 中获取 POST 请求的 JSON 响应?
【发布时间】:2012-04-18 16:10:56
【问题描述】:

我有一个带有 html 的 WebView,其中包含一个表单(帖子)。单击某个提交按钮时,我会收到 JSON 响应。

我怎样才能得到这个 JSON?

如果我不拦截请求,则 json 会显示在 webview 上,所以我想我应该使用shouldInterceptRequest(我正在使用 API 12),但我不知道如何获取其中的 json .

或者也许有更好的方法,比如拦截响应而不是请求?

mWebView.loadUrl(myURL);  

isPageLoaded = false; // used because the url is the same for the response

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest (WebView view, String url) {

        if(isPageLoaded){
            // get the json
            return null;
        }
        else return super.shouldInterceptRequest(view, url);
    }

    public void onPageFinished(WebView view, String url) {
        isPageLoaded = true;
    }
});

谢谢

【问题讨论】:

    标签: android json post android-webview


    【解决方案1】:

    你应该重写WebViewClientshouldOverrideUrlLoading方法

    @Override
    public boolean shouldOverrideUrlLoading (WebView view, String url) {
    
        if(flag) { 
    
                URL aURL = new URL(url); 
                URLConnection conn = aURL.openConnection(); 
                conn.connect(); 
                InputStream is = conn.getInputStream(); 
                // read inputstream to get the json..
                ...
                ...
                return true;
        }
    
        return false
    }
    
    @override
    public void onPageFinished (WebView view, String url) {
        if (url contains "form.html") {
            flag = true;
        }
    }
    

    也看看这个How do I get the web page contents from a WebView?

    【讨论】:

    • 它不起作用,因为 URL 与表单中的 URL 相同,并且通过您的解决方案,我得到了带有表单的 html。而不是拦截请求,我应该在 webview 中显示之前拦截响应,或者使用 post 参数发送请求......
    • 您应该忽略表单页面并捕获下一页加载...文档说“当新的 url 即将在当前网络视图。”因此,您应该在表单加载完成时设置一个标志,并立即捕获发生的下一次加载..
    • 不要比较 url.. 设置一个标志以知道何时加载表单以及何时加载 json..
    • 有什么方法可以拦截响应?
    【解决方案2】:

    这是我如何实现这一点的,因为提到的方法开始抱怨 UI 线程网络连接。

    使用 ChromeWebView 客户端和控制台记录输出

        public void OnSignUp_Click(View v) {
        WebView mWebview = new WebView(this);
    
        mWebview.getSettings().setJavaScriptEnabled(true); // enable javascript
    
        final Activity activity = this;
    
        mWebview.setWebChromeClient(new WebChromeClient() {
            public boolean onConsoleMessage(ConsoleMessage cmsg)
            {
    
                    /* process JSON */
                cmsg.message();
                return true;
    
            }
        });
    
        mWebview.setWebViewClient(new WebViewClient() {
    
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                Log.e("Load Signup page", description);
                Toast.makeText(
                        activity,
                        "Problem loading. Make sure internet connection is available.",
                        Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
                view.loadUrl("javascript:console.log(document.body.getElementsByTagName('pre')[0].innerHTML);");
            }
        });
    
        mWebview.loadUrl("https://yourapp.com/json");
    
    }
    

    希望对他人有所帮助。

    【讨论】:

    • 这是迄今为止最简单的解决方案,也是对我真正有用的解决方案,用于捕获重定向的 SAML JSON 响应。额外的好处:非常简单,UI 上没有网络异常。
    • 仅当网页在日志中打印消息时才有效。它没有收到 POST 请求。
    【解决方案3】:

    嗯,简短的回答是它的工作原理与 shouldOverrideUrlLoading(WebView view, String url),如图 WebView 教程。

    要开始使用,请参阅下面的代码。您只需覆盖 shouldInterceptRequest(WebView view, String url) 方法 Web 视图客户端。显然你不必内联这样做,但是对于 为了紧凑,这就是我所做的:

    看看this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多