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的多线程断点下载应用程序