在Webview中加载URL并获取其响应

4

我是一名有帮助的助手,可以为您进行文本翻译。

我正在加载一个网址到我的WebView中。这是一个登录页面。当我在该登录页面输入我的凭据并通过身份验证后,我想找到所获得的响应。

到目前为止,我已经完成了以下工作:

Login.java

wvLogin = (WebView)findViewById(R.id.WVLogin);

// WebView settings
wvLogin.getSettings().setJavaScriptEnabled(true);
wvLogin.getSettings().setUseWideViewPort(true);

// Load url
wvLogin.loadUrl("myUrl");

// Set WebViewClient to load the url in webview and not phone's default browser.
wvLogin.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        redirected =view.getUrl();
        redirected=  Uri.decode(redirected);

        if (redirected != null && redirected.equals(redirectUri)) {
            wvLogin.stopLoading();
            Intent mIntent = new Intent(LoginActivity.this, Update.class);
            startActivity(mIntent);
        }
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon)  {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

});

我该如何继续进行呢?


不是很清楚。当您在网站上单击登录按钮时,应该得到什么响应?它必须重定向到其他页面。 - Qadir Hussain
输入登录凭据后,您会得到什么?无需重定向页面,Webview 将处理该事项。 - W I Z A R D
你有检查 logcat 获取响应吗? - incr3dible noob
@QadirHussain 当我点击登录按钮后,我期望得到一个令牌作为响应。 - Stack Over
@StackOver 是什么令牌? - W I Z A R D
显示剩余2条评论
3个回答

3

试试这个--

建立一个JavaScript接口

wvLogin.getSettings().setJavaScriptEnabled(true);
wvLogin.addJavascriptInterface(new JSInterface(), "HTMLOUT");

在onPageFinished()中获取HTML标签

@Override
public void onPageFinished(WebView view, String url) {
 view.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}

添加定义你的JS接口。
//JavaScript interface
class MyJavaScriptInterface {
    public void showHTML(String result) {
      String htmlString = result;
      //Do your stuff with the result
    }
}

这只适用于API 17及以上版本


1
我们需要在 showHTML 函数前添加 @JavascriptInterface 注解。 - Shailendra Madda

1

让您的登录结果页面包含一个带有所需令牌信息的元标签。

在您的活动中设置wvLogin:

_wvLogin.getSettings().setJavaScriptEnabled(true);

_wvLogin.addJavascriptInterface(new Object() {
    @SuppressWarnings("unused")
    @android.webkit.JavascriptInterface
    public void saveMetaTag(final String name, final String value) {
        //Save meta tag value in some dictionary
    }

    @SuppressWarnings("unused")
    @android.webkit.JavascriptInterface
    public void onNoMoreMetaTags() {
        //Process meta tags
    }

}, "metaLoader");

然后通过执行JavaScript读取元标记:
wvLogin.loadUrl("javascript:var metaTags = document.getElementsByTagName('meta'); if (metaTags != null && metaTags.length > 0) {var i; for (i=0;i<metaTags.length;i++) { window.metaLoader.saveMetaTag(metaTags[i].name, metaTags[i].content);  };  }; window.metaLoader.onNoMoreMetaTags();");

0
为此,您需要使用WebViewClient。类似于 wvLogin.setWebChromeClient(new YourWebClient());
String htmlContent = "";
private class YourWebClient extends WebViewClient{

    // you want to catch when an URL is going to be loaded
    public boolean  shouldOverrideUrlLoading  (WebView  view, String  urlConection){
        URL aURL = new URL(url); 
        URLConnection conn = aURL.openConnection(); 
        conn.connect(); 
        InputStream is = conn.getInputStream();
        htmlContent = convertToString(is);
    }

    public String convertToString(InputStream inputStream){
       StringBuffer string = new StringBuffer();
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
       String line;
       try {
          while ((line = reader.readLine()) != null) {
             string.append(linea + "\n");
          }
       } catch (IOException e) {}
       return string.toString();
    }
}

我之前尝试过这个,但结果只是一个空白的网页。 - Stack Over

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接