在Android应用程序中提交带有POST数据的表单

在Android应用程序中提交带有POST数据的表单,android,forms,post,android-intent,Android,Forms,Post,Android Intent,我已经在网上搜索了大约一个星期的方法来实现这一点,但我似乎无法找到答案 我正在尝试实现一个应用程序,我的大学可以使用它让用户轻松登录校园的各种服务。当前的工作方式是他们进入一个在线门户,选择他们想要的服务,填写用户名和pwd,然后单击登录。表单数据通过post(包括几个隐藏值以及用户名和pwd)发送到相应的登录脚本,然后登录并加载服务 我一直试图从两个方面来解决这个问题。我首先尝试了一个WebView,但它似乎不想支持通常使表单工作的所有html。我得到了我需要的所有元素,user和pwd的字段

我已经在网上搜索了大约一个星期的方法来实现这一点,但我似乎无法找到答案

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

我一直试图从两个方面来解决这个问题。我首先尝试了一个WebView,但它似乎不想支持通常使表单工作的所有html。我得到了我需要的所有元素,user和pwd的字段以及一个login按钮,但是单击按钮什么也做不了。我想知道是否需要为它添加一个onclick处理程序,但我看不出按钮是如何在webview的html中实现的,而不是使用单独的android元素

另一种可能性是使用xml小部件以良好的相对布局创建表单,这样看起来加载速度更快,在android屏幕上看起来更好。我使用EditText字段进行输入,使用微调器小部件进行服务选择,使用按钮小部件进行登录。我知道如何分别为按钮和微调器创建onclick和item select处理程序,但我不知道如何通过POST发送数据,然后启动浏览器。我可以用actionurl来做一个意图,但无法将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屏幕(应该是我登录到服务后返回的页面)显示在浏览器中?

仅使用内置浏览器有什么问题?您还可以使用和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字符串并显示它。

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

私有静态字符串responseValue;
@SuppressWarnings({“unchecked”,“rawtypes”})
公共静态字符串sendPostToTargetAndWaitForResponse()引发ClientProtocolException,IOException{
最终线程currentThread=Thread.currentThread();
已同步(当前线程){
HttpParams params=新的BasicHttpParams();
HttpClient=新的默认HttpClient(参数);
HttpPost=newhttppost(HTTP_post_URI);
//使用UrlEncodedFormEntity的post数据创建列表
ArrayList mList=新的ArrayList();
mList.add(新的NameValuePair(){
@凌驾
公共字符串getValue(){
返回getSampleJSON();
}
@凌驾
公共字符串getName(){
返回“json”;
}
});
setEntity(新的UrlEncodedFormEntity(mList));//带有键值对列表
client.execute(post,newresponseHandler(){
@凌驾
公共对象HandlerResponse(HttpResponse响应)抛出ClientProtocolException,IOException{
responseValue=EntityUtils.toString(response.getEntity(),“UTF-8”);
已同步(当前线程){
currentThread.notify();
}
返回null;
}
}); 
试一试{
currentThread.wait();
}捕捉(中断异常e){
e、 printStackTrace();
}
返回响应值;
} 
}

理想情况下,我正在尝试在主屏幕上添加一个允许直接登录的小部件。我不知道HttpPost和UrlEncodedFormEntity。我理解代码,直到您有“client.execute”(“.什么是“client”请参阅?在尝试您的代码建议后更新,一些更改是必要的,包括try/catch块和使用BasicResponseHandler()vs原始类型ResponseHandler。如果我不想在提交表单时打开浏览器,而只是从服务器获取JSON响应并在另一个活动中显示,我是否应该像上面那样执行client.execute(post,new BasicResponseHandler)?
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;
    } 
}