【问题标题】:Submit form with POST data in Android app在 Android 应用中提交带有 POST 数据的表单
【发布时间】:2010-06-08 18:00:28
【问题描述】:

我已经在网上搜索了大约一个星期的方法,但我似乎无法弄清楚。

我正在尝试实现一个应用程序,我的大学可以使用它来让用户轻松登录校园内的各种服务。目前的工作方式是他们去一个在线门户,选择他们想要的服务,填写他们的用户名和密码,然后单击登录。表单数据通过 post(它包括几个隐藏值以及用户名和密码)发送到相应的登录脚本,然后登录脚本并加载服务。

我一直试图通过两种方式解决这个问题。我首先尝试了一个 WebView,但它似乎不想支持通常使该表单工作的所有 html。我得到了我需要的所有元素,用户和密码字段以及登录按钮,但是单击该按钮没有任何作用。我想知道是否需要为它添加一个 onclick 处理程序,但我看不到按钮是如何在 webview 的 html 中实现的,而不是使用单独的 android 元素。

另一种可能性是使用 xml 小部件以良好的相对布局创建表单,这似乎加载速度更快,并且在 android 屏幕上看起来更好。我使用 EditText 字段进行输入,使用微调器小部件进行服务选择,并使用按钮小部件进行登录。我知道如何分别为按钮和微调器制作 onclick 和 item select 处理程序,但我不知道如何通过 POST 以随后启动浏览器的意图发送该数据。我可以使用操作 url 做一个意图,但无法获取 POST 数据来输入它。

这就是我现在所拥有的......

HttpParams params = new BasicHttpParams();
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost(action);
String endResult = null;

try 
{
post.setEntity(new UrlEncodedFormEntity(myList));
} 
catch (UnsupportedEncodingException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 

try 
{
String response = client.execute(post, new BasicResponseHandler());
endResult = response;
} 
catch (ClientProtocolException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 
catch (IOException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
}  

所以我现在的问题是......我如何获取 endResult 屏幕,这应该是我登录到我的服务后返回的页面,并在浏览器中显示它?

【问题讨论】:

  • 如果我不想在提交表单时打开浏览器,而只是从服务器获取 JSON 响应并将其显示在另一个活动中,我应该只执行 client.execute(post,new BasicResponseHandler ) 如上?

标签: android forms post android-intent


【解决方案1】:

他们只使用内置浏览器有什么问题?您也可以使用UrlEncodedFormEntity 和 HttpClient 提交表单。

HttpParams params = new DefaultHttpParams(); // setup whatever params you what
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost("someurl");
post.setEntity(new UrlEncodedFormEntity()); // with list of key-value pairs
client.execute(post, new ResponseHandler(){}); // implement ResponseHandler to handle response correctly.

好的,在你得到一个字符串的响应之后。因为它是一个页面,所以响应将在 html 中。您需要使用 WebView 来显示 html。 WebView 有一个 loadData() 方法,它接受一个 html 字符串并显示它。

【讨论】:

  • 理想情况下,我正在尝试在主屏幕上添加一个允许直接登录的小部件。我不知道 HttpPost 和 UrlEncodedFormEntity。我理解代码直到你有“client.execute(”。“client”指的是什么?
  • 在尝试您的代码建议后更新,一些更改是必要的,比如 try/catch 块,并使用 BasicResponseHandler() 与原始类型 ResponseHandler。
【解决方案2】:

基于@RobbyPonds 的回答,为了方便路过这里的人们,下面是发布和接收来自 URI 响应的通用实现(注意还包含等待实现以返回响应,可能不是每天都执行网络调用):

private static String responseValue;

@SuppressWarnings({ "unchecked", "rawtypes" })  
public static String sendPostToTargetAndWaitForResponse() throws ClientProtocolException, IOException {     
    final Thread currentThread = Thread.currentThread();
    synchronized (currentThread) {      

        HttpParams params = new BasicHttpParams();
        HttpClient client = new DefaultHttpClient(params);
        HttpPost post = new HttpPost(HTTP_POST_URI);

        // List Creation with post data for UrlEncodedFormEntity
        ArrayList<NameValuePair> mList = new ArrayList<NameValuePair>();
        mList.add(new NameValuePair() {

            @Override
            public String getValue() {
                return getSampleJSON();
            }

            @Override
            public String getName() {
                return "json";
            }
        });
        post.setEntity(new UrlEncodedFormEntity(mList)); // with list of key-value pairs
        client.execute(post, new ResponseHandler(){

            @Override
            public Object handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                responseValue = EntityUtils.toString(response.getEntity(), "UTF-8");
                synchronized (currentThread) {                          
                    currentThread.notify();
                }
                return null;
            }
        }); 
        try {
            currentThread.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return responseValue;
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多