首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android(5)数据存储之五网络数据交互 3

2012-09-01 
Android(五)数据存储之五网络数据交互 3其中使用到的HttpRequester类:package com.changcheng.web.client.

Android(五)数据存储之五网络数据交互 3

其中使用到的HttpRequester类:

package com.changcheng.web.client.service;

?

import java.io.DataOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HTTP;

import org.apache.http.util.EntityUtils;

import android.util.Log;

?

/**

?* http请求发送器

?*/

public class HttpRequester {

???????? /**

???????? ?* 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:

???????? ?*?? <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">

??????????????????????????? <INPUT TYPE="text" NAME="name">

??????????????????????????? <INPUT TYPE="text" NAME="id">

??????????????????????????? <input type="file" name="imagefile"/>

?????????????????? ??? <input type="file" name="zip"/>

?????????????????? ?</FORM>

???????? ?* @param actionUrl 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

???????? ?* @param params 请求参数 key为参数名,value为参数值

???????? ?* @param file 上传文件

???????? ?*/

???????? public static String post(String actionUrl, Map<String, String> params, FormFile[] files) {

???????? ??? try {???? ???????

???????? ??????? String BOUNDARY = "---------7d 4a6d158c9"; //数据分隔线

???????? ??????? String MULTIPART_FORM_DATA = "multipart/form-data";

???????? ???????

???????? ??????? URL url = new URL(actionUrl);

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

???????? ??????? conn.setConnectTimeout(6* 1000);

???????? ??????? conn.setDoInput(true);//允许输入

???????? ??????? conn.setDoOutput(true);//允许输出

???????? ??????? conn.setUseCaches(false);//不使用Cache

???????? ??????? conn.setRequestMethod("POST");??????? ???????

???????? ??????? conn.setRequestProperty("Connection", "Keep-Alive");

???????? ??????? conn.setRequestProperty("Charset", "UTF-8");

???????? ??????? conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);

?

???????? ??????? StringBuilder sb = new StringBuilder();

???????? ??????? for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容

???????? ????????? ??sb.append("--");

???????? ??????????? sb.append(BOUNDARY);

???????? ??????????? sb.append("\r\n");

???????? ??????????? sb.append("Content-Disposition: form-data; name=""+ entry.getKey() + ""\r\n\r\n");

???????? ??????????? sb.append(entry.getValue());

???????? ??????????? sb.append("\r\n");

???????? ??????? }

???????? ??????? DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

???????? ??????? outStream.write(sb.toString().getBytes());//发送表单字段数据

???????? ??????? for(FormFile file : files){//发送文件数据

???????? ??????? ???? StringBuilder split = new StringBuilder();

???????? ???????? ??????? split.append("--");

???????? ???????? ??????? split.append(BOUNDARY);

???????? ???????? ??????? split.append("\r\n");

???????? ???????? ??????? split.append("Content-Disposition: form-data;name=""+ file.getFormname()+"";filename=""+ file.getFilname() + ""\r\n");

???????? ???????? ??????? split.append("Content-Type: "+ file.getContentType()+"\r\n\r\n");

???????? ???????? ??????? outStream.write(split.toString().getBytes());

???????? ???????? ??????? if(file.getInStream()!=null){

???????? ???????? ??????? ???? byte[] buffer = new byte[1024];

???????? ???????? ??????? ???? int len = 0;

???????? ???????? ??????? ???? while((len = file.getInStream().read(buffer))!=-1){

???????? ???????? ??????? ?????????????? outStream.write(buffer, 0, len);

???????? ???????? ??????? ???? }

???????? ???????? ??????? ???? file.getInStream().close();

???????? ???????? ??????? }else{

???????? ???????? ??????? ???? outStream.write(file.getData(), 0, file.getData().length);

???????? ???????? ??????? }

???????? ???????? ??????? outStream.write("\r\n".getBytes());

???????? ??????? }

???????? ??????? byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();//数据结束标志 ??????

???????? ??????? outStream.write(end_data);

???????? ??????? outStream.flush();

???????? ??????? int cah = conn.getResponseCode();

???????? ??????? if (cah != 200) throw new RuntimeException("请求url失败");

???????? ??????? InputStream is = conn.getInputStream();

???????? ??????? int ch;

???????? ??????? StringBuilder b = new StringBuilder();

???????? ??????? while( (ch = is.read()) != -1 ){

???????? ??????? ???? b.append((char)ch);

???????? ??????? }

???????? ??????? Log.i("ItcastHttpPost", b.toString());????? ???????

???????? ??????? outStream.close();

???????? ??????? conn.disconnect();

???????? ??????? return b.toString();

???????? ??? } catch (Exception e) {

???????? ??? ?? throw new RuntimeException(e);

???????? ??? }

???????? }

????????

???????? /**

???????? ?* 提交数据到服务器

???????? ?* @param actionUrl 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

???????? ?* @param params 请求参数 key为参数名,value为参数值

???????? ?* @param file 上传文件

???????? ?*/

???????? public static String post(String actionUrl, Map<String, String> params, FormFile file) {

???????? ?? return post(actionUrl, params, new FormFile[]{file});

???????? }

????????

???????? /**

???????? ?* 提交数据到服务器

???????? ?* @param actionUrl 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

???????? ?* @param params 请求参数 key为参数名,value为参数值

???????? ?*/

???????? public static String post(String actionUrl, Map<String, String> params) {

?????????????????? ?? HttpPost httpPost = new HttpPost(actionUrl);

?????????????????? ?? List<NameValuePair> list = new ArrayList<NameValuePair>();

?????????????????? ?? for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容

??????????????????????????? ?? list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

?????????????????? ?? }

?????????????????? ?? try {

??????????????????????????? httpPost.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));

??????????????????????????? HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);

??????????????????????????? if(httpResponse.getStatusLine().getStatusCode() == 200){

???????????????????????????????????? return EntityUtils.toString(httpResponse.getEntity());

?????????????????? ??? }

?????????????????? } catch (Exception e) {

??????????????????????????? throw new RuntimeException(e);

?????????????????? }

?????????????????? return null;?

??? }

}

?????? 我们最好对HTTP协议有深入的了解,这样在编写简单数据交互应用时直接面向HTTP协议编程可以提高运行速度并减少资源的占用。

?????? 我们在最后一个方法中使用到的HttpPost类,是Apache开源组织提供的httpcomponents-client-4.0.1包。httpcomponents-client-4.0.1可以实现浏览器的大部分功能,但如果我们能不使用它就尽量不使用它,因为这会造成对手机硬件资源的占用,从而减慢应用程序的运行速度。

?

?????? 4.测试类

package com.changcheng.web.client.test;

?

import com.changcheng.web.client.service.ClientService;

import android.test.AndroidTestCase;

?

public class TestAndroidClientService extends AndroidTestCase {

?

???????? public void testSendDataToServerByGet() throws Throwable {

?????????????????? ClientService.sendDataToServerByGet();

???????? }

?

???????? public void testSendDataToServerByPost() throws Throwable {

?????????????????? ClientService.sendDataTOserverByPost();

???????? }

?

???????? public void testSendDataToServerByForm() throws Throwable {

?????????????????? ClientService.sendDataToServerByForm();

???????? }

}

?

?

?????? 5.运行

?????? 首先启动AndroidWebService应用程序,然后运行测试方法,查看运行结果。

?

?????? 下一篇:Android的多线程断点下载应用程序

热点排行