【问题标题】:How to intercept POST data in an android webview如何在 android webview 中拦截 POST 数据
【发布时间】:2011-09-28 14:10:16
【问题描述】:

我有一个由 webview 组成的 android 应用程序。它需要允许用户在网页上填写表单,然后在用户点击表单上的submit 后更改表单的数据。该表单将使用 POST 请求方法。

所以我的问题是,如何从表单中截取 POST 数据,更改其值,然后将其发送出去?

例如:如果有这样的网络表单...

<form action="http://www.example.com/do.php" method="post">
    <input type="text" name="name" />
    <input type="text" name="email" />
    <input type="submit" />
</form>

如果用户在表单中输入 name = Steve 和 email = steve@steve.com,我想在 android 应用程序中将值更改为 name = bob 和 email = bob@bob.com 并设置新的 POST发送至http://www.example.com/do.php

感谢您的帮助!

【问题讨论】:

  • 发布您的完整代码,我可以帮助您
  • 嗨@surenda。如果您对此主题有所了解,我将非常感谢您的帮助。我现在只有一个基本的 webview 来启用 javascript 并设置 webview 客户端。我只需要为我的客户提供概念证明,这样我就可以继续开发。我最初尝试自己创建帖子数据并使用postUrl() 提交,但效果不佳。这个项目的计划是能够与任何使用 POST 表单的网站一起工作,所以我没有任何网站代码。如果您仍然想查看我的代码,我会发布它,但是 ATM 并不多。谢谢!
  • 可能用户在输入凭据后按下了某个按钮,只需将代码放在 onClickListener 下,从 EditText 获取数据,修改并发送新帖子。可以在另一个线程中执行此操作,以便通常的 POST 也将被发送
  • 这是个好主意...我认为这就是我必须做的事情。我不确定如何为 webView 中的页面设置 onClickListener(在 webview 上设置它不起作用),我试过 shouldOverrideUrlLoading() 没有运气。如果您可以在答案中提供更多详细信息,将不胜感激,我很可能会将其发布为已接受的答案。谢谢! @MocialovBoris
  • 我有一篇小贴士如何使用 HttpClient,和 HttpConnection 很相似:stackoverflow.com/questions/6746375/java-httppost-into-asp-form

标签: android http post webview


【解决方案1】:

如果您熟悉 JavaScript,我建议您使用 JavaScript。我认为它更方便和容易。 Thistour 告诉你如何在 WebView 中使用 JavaScript。

【讨论】:

  • 我已经很长时间没有从事这个项目了(可能是 2 年),但我相信这会奏效。我最终做的是让用户输入他们的 url,然后我会从服务器中提取原始 html 并将其解析出来以插入我的自定义代码以更改表单提交的方式。我相信在代码中插入我可以挂钩的自定义 javascript 会产生奇迹,但我从未尝试过。感谢您的回答!
【解决方案2】:

我编写了一个带有特殊 WebViewClient 的库,它提供了修改后的 shouldOverrideUrlLoading,您可以在其中访问帖子数据。

https://github.com/KonstantinSchubert/request_data_webviewclient

不幸的是,我的实现仅适用于 XMLHttpRequest (AJAX) 请求。但是其他人已经起草了如何处理表单数据:https://github.com/KeejOow/android-post-webview

在两个仓库之间,你应该能找到你的答案:)

【讨论】:

    【解决方案3】:

    如果您使用 postUrl() 方法提交表单,那么您可以像这样覆盖 WebView 对象中的 postUrl 方法。

     WebView mWebView = new WebView(this){
    
            @Override
            public void  postUrl(String  url, byte[] postData)
            {
                System.out.println("postUrl can modified here:" +url);
                super.postUrl(url, postData);
            }};
     LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
     linearLayout.addView(mWebView);
    

    【讨论】:

    • 我想你误解了我的问题。我没有在代码中提交表单,而是用户会在 webview 中提交表单,我试图拦截发布数据。截获帖子数据是我的大部分问题所在。我很久以前就把这个项目交给了另一个开发者(长话短说:便宜的客户),所以我无法真正测试它是否有效。我想我最终做的是拦截用户输入的 url,然后解析原始 html 并插入我自己的代码,然后在 webview 中显示。这让我可以改变提交表单的方式。
    【解决方案4】:

    我喜欢 public void postUrl(String url, byte[] postData) 的建议,但不幸的是它对我不起作用。

    我的解决方案只是拦截 POST 请求:

    • 有一个为 WebView 设置的 WebViewClient 子类
    • 覆盖 public void onPageStarted(WebView view, String url, Bitmap favicon) 以检查请求数据并采取相应措施(根据要求)

    此处的代码摘录和其他想法:https://stackoverflow.com/a/9493323/2162226

    【讨论】:

    • 你从哪里得到请求? url只给出get参数
    • 我其实只是用这个方案来处理表单提交后的UI更新。我没有做提取/修改 POST 参数的部分。这里的这篇文章似乎解决了 POST 参数 stackoverflow.com/a/21095771/2162226 的情况。正如它所提到的,一种选择(虽然可能不是很好)是使用 UI 数据执行您自己的 Web 请求
    • 这里还有一篇文章描述了一种发送您自己的帖子数据stackoverflow.com/a/6290178/2162226 的方法。感兴趣的代码: String postData = "username=my_username&password=my_password"; webview.postUrl(url,EncodingUtils.getBytes(postData, "BASE64")); .. 然后在 onPageStarted() 方法中.. 我猜你不会调用超级实现。 super.onPageStarted(view, url, favicon); ..将不得不尝试看到
    • 啊,但是您看到这是将帖子提交到 webview。我所说的是捕获用户刚刚通过 webview 提交的 POST 请求。我进行了一些研究,发现自 API Level 21 以来这已成为可能,但不支持较旧的 API。我想出了一个 javascript 小技巧来解决问题。
    • 那么,您拦截帖子的解决方案是什么?我已经使用 should interceptRequeset 方法捕获了请求,但是我无法访问请求正文,这是我真正需要的。
    【解决方案5】:

    在您的WebView 中覆盖onPageStarted 回调

    【讨论】:

    • 那么他是如何获取和修改POST请求的内容的呢?
    • 嘿 A.Quiroga。我不确定如何从onPageStarted() 获取 POST 数据。你能再详细一点吗?谢谢!
    【解决方案6】:

    我认为你可以使用 WebViewClient 的shouldInterceptRequest(WebView view, String url) 方法,但它在 API 11 之后的版本中支持。

    【讨论】:

    • 这个函数只拦截GET请求。
    • POST 请求甚至没有调用这个函数.. 也不是 laodUrl 方法.. 一个非常愚蠢的 android 问题...
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多