Android应用开发之Android平台向web应用提交信息

GET方式

实验:提交视频名称、时长信息

url:

http://192.168.1.102:8080/videoweb/video/manage.do?method=save&name=xxx&timelength=90

资源

 <string name="app_name">VideoClient</string>

    <string name="name">视频名称</string>

    <string name="timeLength">时长</string>

    <string name="save">保存</string>

    <string name="success">数据保存成功</string>

    <string name="fail">数据保存失败</string>

    <string name="error">网络连接失败</string>

    <string name="videoFile">视频文件</string>
布局
<TextView

        
android:layout_width="fill_parent"

        android:layout_height
="wrap_content"

        android:text
="@string/name" />

 

    <EditText

        
android:id="@+id/nameEt"

        android:layout_width
="match_parent"

        android:layout_height
="wrap_content" >

 

        <requestFocus />

    </EditText>

 

    <TextView

        
android:layout_width="fill_parent"

        android:layout_height
="wrap_content"

        android:text
="@string/timeLength" />

 

    <EditText

        
android:id="@+id/timeLengthEt"

        android:layout_width
="match_parent"

        android:layout_height
="wrap_content" >

    </EditText>

 

    <Button

        
android:id="@+id/saveBtn"

        android:layout_width
="wrap_content"

        android:layout_height
="wrap_content"

        android:text
="save" />
VideoService
public static boolean save(String name, String timeLength) throws Exception {

       String path = "http://192.168.1.102:8080/videoweb/video/manage.do";

       Map<String, String> params = new HashMap<String, String>();

       params.put("name", name);

       params.put("timelength", timeLength);

       params.put("method", "save");

 

       return sendPostRequestHttpClient(path, params, "UTF-8");

    }

 

    private static boolean sendPostRequestHttpClient(String path,

           Map<String, String> params, String string) throws Exception {

       // http://192.168.1.102:8080/videoweb/video/manage.do?method=save&name=xxx&timelength=90

       StringBuilder pathBuilder = new StringBuilder(path);

       pathBuilder.append("?");

       

       for (Map.Entry<String, String> entry : params.entrySet()) {

           pathBuilder.append(entry.getKey()).append("=")

                  .append(entry.getValue()).append("&");

       }

       pathBuilder.deleteCharAt(pathBuilder.length() - 1);

       

       URL url = new URL(pathBuilder.toString());

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       conn.setRequestMethod("GET");

       conn.setConnectTimeout(5000);

       if (conn.getResponseCode() == 200) {

           return true;

       }

       return false;

    }

测试方法代码

VideoServiceTest

 public void testSave() throws Throwable{

       VideoService.save("Sucan", "80");

    }

 

中文字符解决方案:

服务器端代码:

VideoForm formbean = (VideoForm)form;

if("GET".equals(request.getMethod())){

    String name = new String(request.getParameter("name")

.getBytes("ISO8859-1"),"UTF-8");

    System.out.println("视频名称: "+ name);

    System.out.println("时长: "+formbean.getTimelength());

}else{

    System.out.println("视频名称: "+formbean.getName());

    System.out.println("时长: "+formbean.getTimelength());

}

 

客户端的VideoService中

 

 

POST方式

修改服务器端代码

Index.jsp

<form action="http://192.168.1.102:8080/videoweb/video/manage.do"

method
="post" >

    <input type="hidden" name="method" value="save"><br/>

    视频名称:<input type="text" name="name" value=""><br/>

    时长:<input type="text" name="timelength" value=""><br/>

    

    <input type="submit" value="提交"> 

</form>    

 

利用HttpWatch对post传输进行简单讲解:
POST /videoweb/video/manage.do HTTP/1.1

Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Referer: http://192.168.1.102:8080/videoweb/

Accept-Language: zh-cn,en-GB;q=0.5

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

Host: 192.168.1.102:8080

Content-Length: 34

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: JSESSIONID=AE51607F874103B085624AD38C68CF56

 

method=save&name=xxxx&timelength=2
编写业务类方法(VideoService)
private static boolean sendPostRequestHttpClient(String path,

           Map<String, String> params, String encoding) throws Exception {

       /*

        * Content-Type: application/x-www-form-urlencoded

        * Content-Length: 34

        * method=save&name=xxxx&timelength=2

        
*/

       StringBuffer sb = new StringBuffer("");

       if (params != null && !params.isEmpty()) {

           for (Map.Entry<String, String> entry : params.entrySet()) {

              sb.append(entry.getKey()).append("=")

              // .append(entry.getValue()).append("&");

                     .append(URLEncoder.encode(entry.getValue(), encoding)).append('&'); //url编码,解决中文乱码

           }

           sb.deleteCharAt(sb.length() - 1);

       }

       

       byte[] data = sb.toString().getBytes(); //得到实体数据eg. method=save&name=xxxx&timelength=2

       URL url = new URL(path);

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       conn.setRequestMethod("POST");

       conn.setConnectTimeout(5000);

       conn.setDoOutput(true); //允许通过POST方式提交数据,必须允许输出

       conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

       conn.setRequestProperty("Content-Length", String.valueOf(data.length));

       

       OutputStream outStream = conn.getOutputStream();

       outStream.write(data);

       outStream.flush();

       outStream.close();

       

       if (conn.getResponseCode() == 200) {

           return true;

       }

       return false;

    }
修改save方法
//     return sendGetRequestHttpClient(path, params, "UTF-8");

       return sendPostRequest(path, params, "UTF-8");

运行客户端,测试代码,查看服务器后台打印

解释Post方式下中文乱码的处理:服务器端增加过滤器

HttpClient

简介

  HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.1.1

HttpClient 功能介绍

  以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。

  (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)

  (2)支持自动转向

  (3)支持 HTTPS 协议

(4)支持代理服务器等

实验步骤

在VideoService中添加方法sendRequestHttpClient

// HTTPS SSL  COOKIE

    private static boolean sendRequestHttpClient(String path,

           Map<String, String> params, String encoding) throws Exception {

       

       List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();

       if(params!=null && !params.isEmpty()){

           for(Map.Entry<String, String> entry: params.entrySet()){

              BasicNameValuePair param = new BasicNameValuePair(entry.getKey(),entry.getValue());

              paramPairs.add(param);

           }

       }

       UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramPairs, encoding);

       HttpPost post = new HttpPost(path);

       post.setEntity(entity);

       DefaultHttpClient client = new DefaultHttpClient(); //浏览器

       HttpResponse response = client.execute(post);

       

       /*

        * HTTP/1.1 200 OK

        * Server: Apache-Coyote/1.1

        * Content-Type: text/html;charset=UTF-8

        * Content-Length: 14

        * Date: Thu, 22 Dec 2011 15:07:38 GMT

        *

        *淇濆瓨鎴愬

        *
*/

       

       if(response.getStatusLine().getStatusCode() == 200){

           return true;

       }

       return false;

    }

 

修改save方法
//     return sendGetRequestHttpClient(path, params, "UTF-8");

//     return sendPostRequest(path, params, "UTF-8");

       return sendRequestHttpClient(path, params, "UTF-8");
运行客户端,测试,查看服务器输出
url:http://greatverve.cnblogs.com/archive/2011/12/30/android-web-get-post.html

 

posted @ 2011-12-30 10:40  大气象  阅读(1396)  评论(2编辑  收藏  举报
http://www.tianqiweiqi.com