Android网络编程之请求和文件上传

1.android 向服务器Get和Post请求的两种方式,android向服务器发送文件,自己组装协议和借助第三方开源

[java]  view plain copy
  1. /**  
  2.  * @author intbird@163.com  
  3.  * @time 20140606  
  4.  */   
  5. package com.intbird.utils;  
  6.   
  7. import java.io.BufferedReader;  
  8. import java.io.DataOutputStream;  
  9. import java.io.File;  
  10. import java.io.FileInputStream;  
  11. import java.io.IOException;  
  12. import java.io.InputStream;  
  13. import java.io.InputStreamReader;  
  14. import java.net.HttpURLConnection;  
  15. import java.net.URL;  
  16. import java.net.URLConnection;  
  17. import java.net.URLDecoder;  
  18. import java.net.URLEncoder;  
  19. import java.nio.charset.Charset;  
  20. import java.util.ArrayList;  
  21. import java.util.HashMap;  
  22. import java.util.Iterator;  
  23. import java.util.Map;  
  24.   
  25. import org.apache.http.HttpResponse;  
  26. import org.apache.http.client.HttpClient;  
  27. import org.apache.http.client.methods.HttpGet;  
  28. import org.apache.http.client.methods.HttpPost;  
  29. import org.apache.http.entity.mime.MultipartEntity;  
  30. import org.apache.http.entity.mime.content.FileBody;  
  31. import org.apache.http.entity.mime.content.StringBody;  
  32. import org.apache.http.impl.client.DefaultHttpClient;  
  33. import org.apache.http.util.EntityUtils;  
  34.   
  35. import android.graphics.Bitmap;  
  36. import android.graphics.BitmapFactory;  
  37. import android.os.Handler;  
  38. import android.os.Message;  
  39.   
  40. public class ConnInternet {  
  41.     /** 
  42.      * 开始连接 
  43.      */  
  44.     public static int HTTP_STATUS_START=0;  
  45.     /** 
  46.      * 连接过程出错 
  47.      */  
  48.     public static int HTTP_STATUS_ERROR=400;  
  49.     /** 
  50.      * 请求成功,返回数据 
  51.      */  
  52.     public static int HTTP_STATUS_REULTOK=200;  
  53.     /** 
  54.      * 服务器未响应 
  55.      */  
  56.     public static int HTTP_STATUS_NORESP=500;  
  57.       
  58.     /** 
  59.      * 普通GET请求 
  60.      * @param api 
  61.      * @param callBack 
  62.      */  
  63.     public static void get1(final String api,final ConnInternetCallback callBack) {  
  64.         final Handler handler=getHandle(api, callBack);  
  65.         new Thread(){  
  66.             @Override  
  67.             public void run() {  
  68.                 Message msg=handler.obtainMessage(HTTP_STATUS_START, "开始连接");  
  69.                 try {  
  70.                     URL url = new URL(api);  
  71.                     HttpURLConnection urlConn =  (HttpURLConnection) url.openConnection();  
  72.                     int resCode=urlConn.getResponseCode();  
  73.                     if(resCode!=HTTP_STATUS_REULTOK){  
  74.                         msg.what=HTTP_STATUS_NORESP;  
  75.                         msg.obj=resCode;  
  76.                         handler.sendMessage(msg);  
  77.                         return ;  
  78.                     }  
  79.                     InputStreamReader inStream=new InputStreamReader(urlConn.getInputStream());  
  80.                     BufferedReader buffer=new BufferedReader(inStream);  
  81.                       
  82.                     String result="";  
  83.                     String inputLine=null;  
  84.                     while((inputLine=buffer.readLine())!=null){  
  85.                         result+=inputLine;  
  86.                     }  
  87.                     msg.what=HTTP_STATUS_REULTOK;  
  88.                     msg.obj=URLDecoder.decode(result,"UTF-8");  
  89.                       
  90.                     inStream.close();  
  91.                     urlConn.disconnect();  
  92.                 } catch (Exception ex) {  
  93.                     msg.what=HTTP_STATUS_ERROR;  
  94.                     msg.obj=ex.getMessage().toString();  
  95.                 }  
  96.                 finally{  
  97.                     handler.sendMessage(msg);  
  98.                 }  
  99.             }  
  100.         }.start();  
  101.     }  
  102.       
  103.     public void get3(final String api,final ConnInternetCallback callBack) {  
  104.         final Handler handler=getHandle(api, callBack);  
  105.         new Thread(){  
  106.             @Override  
  107.             public void run() {  
  108.                 Message msg=handler.obtainMessage(HTTP_STATUS_START, "开始连接");  
  109.                 try {  
  110.                     HttpGet httpGet=new HttpGet(api);  
  111.                     HttpClient httpClient = new DefaultHttpClient();  
  112.                     HttpResponse httpResp = httpClient.execute(httpGet);  
  113.   
  114.                     int resCode=httpResp.getStatusLine().getStatusCode();  
  115.                     if(resCode!=HTTP_STATUS_REULTOK){  
  116.                         msg.what=HTTP_STATUS_NORESP;  
  117.                         msg.obj=resCode;  
  118.                         handler.sendMessage(msg);  
  119.                         return ;  
  120.                     }  
  121.                     msg.what=HTTP_STATUS_REULTOK;  
  122.                     msg.obj= EntityUtils.toString(httpResp.getEntity());  
  123.                       
  124.                 }catch (Exception e) {  
  125.                     msg.what=HTTP_STATUS_ERROR;  
  126.                     msg.obj= e.getMessage();  
  127.                 }  
  128.                 finally{  
  129.                     handler.sendMessage(msg);  
  130.                 }  
  131.             }  
  132.         }.start();  
  133.     }  
  134.       
  135.     private static Handler getHandle(final String api,final ConnInternetCallback callBack){  
  136.         return new Handler() {  
  137.             @Override  
  138.             public void handleMessage(Message message) {  
  139.                 //不 在 这里写!  
  140.                 callBack.callBack(message.what,api, message.obj.toString());  
  141.             }  
  142.         };  
  143.     }  
  144.   
  145.     /** 
  146.      * 简单类型,只进行文字信息的POST; 
  147.      * @param api api地址 
  148.      * @param params 仅字段参数 
  149.      * @param callBack 返回调用; 
  150.      */  
  151.     public static void post1(final String api,final HashMap<String,String> params,final ConnInternetCallback callBack){  
  152.         final Handler handler=getHandle(api, callBack);  
  153.         new Thread(){  
  154.             @Override  
  155.             public void run() {  
  156.                 Message msg=handler.obtainMessage(HTTP_STATUS_START,"开始连接");  
  157.                 try {  
  158.                     URL url=new URL(api);  
  159.                     HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
  160.                     urlConn.setDoInput(true);  
  161.                     urlConn.setDoOutput(true);  
  162.                     urlConn.setRequestMethod("POST");  
  163.                     urlConn.setUseCaches(false);  
  164.                     urlConn.setInstanceFollowRedirects(true);  
  165.                     urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
  166.                     urlConn.setRequestProperty("Charset""UTF-8");  
  167.                       
  168.                     urlConn.connect();  
  169.                     DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());    
  170.                     Iterator<String> iterator=params.keySet().iterator();  
  171.                     while(iterator.hasNext()){  
  172.                         String key= iterator.next();  
  173.                         String value= URLEncoder.encode(params.get(key),"UTF-8");  
  174.                         out.write((key+"="+value+"&").getBytes());   
  175.                      }  
  176.                     out.flush();    
  177.                     out.close();    
  178.                       
  179.                     int resCode=urlConn.getResponseCode();  
  180.                     if(resCode!=HTTP_STATUS_REULTOK){  
  181.                         msg.what=HTTP_STATUS_NORESP;  
  182.                         msg.obj=resCode;  
  183.                         handler.sendMessage(msg);  
  184.                         return ;  
  185.                     }  
  186.                     String result="";  
  187.                     String readLine=null;  
  188.                     InputStreamReader inputStream=new InputStreamReader(urlConn.getInputStream());  
  189.                     BufferedReader bufferReader=new BufferedReader(inputStream);  
  190.                     while((readLine=bufferReader.readLine())!=null){  
  191.                         result+=readLine;  
  192.                     }  
  193.                     msg.what=HTTP_STATUS_REULTOK;  
  194.                     msg.obj=URLDecoder.decode(result,"UTF-8");  
  195.                     inputStream.close();  
  196.                     bufferReader.close();  
  197.                     urlConn.disconnect();  
  198.                 }catch(Exception ex){  
  199.                     msg.what=HTTP_STATUS_ERROR;  
  200.                     msg.obj=ex.getMessage().toString()+".";  
  201.                 }  
  202.                 finally{  
  203.                     handler.sendMessage(msg);  
  204.                 }  
  205.             }  
  206.         }.start();  
  207.     }  
  208.   
  209.     /** 
  210.      * 自定义文字和文件传输协议[示例在函数结尾]; 
  211.      * @param apiUrl api地址 
  212.      * @param mapParams 文字字段参数 
  213.      * @param listUpFiles 多文件参数 
  214.      * @param callBack 返回调用; 
  215.      */  
  216.     public static void post2(final String apiUrl,final HashMap<String,String> mapParams,final ArrayList<ConnInternetUploadFile> listUpFiles,ConnInternetCallback callBack){  
  217.         final Handler handler=getHandle(apiUrl, callBack);  
  218.         new Thread(new Runnable() {  
  219.             public void run() {  
  220.                 Message msg=handler.obtainMessage(HTTP_STATUS_START, "开始连接");  
  221.                   
  222.                 String BOUNDARY="———7d4a6454354fe54scd";  
  223.                 String PREFIX="--";  
  224.                 String LINE_END="\r\n";  
  225.                   
  226.                 try{  
  227.                     URL url=new URL(apiUrl);  
  228.                     HttpURLConnection urlConn=(HttpURLConnection) url.openConnection();  
  229.                     urlConn.setDoOutput(true);  
  230.                     urlConn.setDoInput(true);  
  231.                     urlConn.setUseCaches(false);  
  232.                     urlConn.setRequestMethod("POST");  
  233.                     urlConn.setRequestProperty("Connection""Keep-Alive");  
  234.                     urlConn.setRequestProperty("Charset""UTF-8");  
  235.                     urlConn.setRequestProperty("Content-Type","multipart/form-data ;boundary="+BOUNDARY);  
  236.                       
  237.                     DataOutputStream outStream=new DataOutputStream(urlConn.getOutputStream());  
  238.   
  239.                     for(Map.Entry<String,String> entry:mapParams.entrySet()){  
  240.                         StringBuilder sbParam=new StringBuilder();  
  241.                         sbParam.append(PREFIX);  
  242.                         sbParam.append(BOUNDARY);  
  243.                         sbParam.append(LINE_END);  
  244.                         sbParam.append("Content-Disposition:form-data;name=\""+ entry.getKey()+"\""+LINE_END);  
  245.                         sbParam.append("Content-Transfer-Encoding: 8bit" + LINE_END);  
  246.                         sbParam.append(LINE_END);  
  247.                         sbParam.append(entry.getValue());  
  248.                         sbParam.append(LINE_END);  
  249.                         outStream.write(sbParam.toString().getBytes());  
  250.                     }  
  251.                       
  252.                     for(ConnInternetUploadFile file:listUpFiles){  
  253.                         StringBuilder sbFile=new StringBuilder();  
  254.                         sbFile.append(PREFIX);  
  255.                         sbFile.append(BOUNDARY);  
  256.                         sbFile.append(LINE_END);  
  257.                         sbFile.append("Content-Disposition:form-data;name=\""+file.getFormname()+"\";filename=\""+file.getFileName()+"\""+LINE_END);  
  258.                         sbFile.append("Content-type:"+file.getContentType()+"\""+LINE_END);  
  259.                         outStream.write(sbFile.toString().getBytes());  
  260.                         writeFileToOutStream(outStream,file.getFileUrl());  
  261.                         outStream.write(LINE_END.getBytes("UTF-8"));  
  262.                     }  
  263.                       
  264.                     byte[] end_data=(PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes("UTF-8");  
  265.                     outStream.write(end_data);  
  266.                     outStream.flush();  
  267.                     outStream.close();    
  268.                   
  269.                     int resCode=urlConn.getResponseCode();  
  270.                     if(resCode!=HTTP_STATUS_REULTOK){  
  271.                         msg.what=HTTP_STATUS_NORESP;  
  272.                         msg.obj=resCode;  
  273.                         handler.sendMessage(msg);  
  274.                         return ;  
  275.                     }  
  276.                     String result="";  
  277.                     String readLine=null;  
  278.                     InputStreamReader inputStream=new InputStreamReader(urlConn.getInputStream());  
  279.                     BufferedReader bufferReader=new BufferedReader(inputStream);  
  280.                     while((readLine=bufferReader.readLine())!=null){  
  281.                         result+=readLine;  
  282.                     }  
  283.                     msg.what=HTTP_STATUS_REULTOK;  
  284.                     msg.obj=URLDecoder.decode(result,"UTF-8");  
  285.                     inputStream.close();  
  286.                     bufferReader.close();  
  287.                     urlConn.disconnect();  
  288.                 }catch(Exception ex){  
  289.                     msg.what=HTTP_STATUS_ERROR;  
  290.                     msg.obj=ex.getMessage().toString();  
  291.                 }  
  292.                 finally{  
  293.                     handler.sendMessage(msg);  
  294.                 }  
  295.             }  
  296.         }).start();  
  297. //      HashMap<String,String> params=new HashMap<String, String>();  
  298. //      params.put("pid", fileHelper.getShareProf("PassportId"));  
  299. //      params.put("json",postJson(text));  
  300.           
  301. //      ArrayList<UploadFile> uploadFiles=new ArrayList<UploadFile>();  
  302. //      if(url.length()>0){  
  303. //          UploadFile upfile=new UploadFile(url,url,"Images");  
  304. //          uploadFiles.add(upfile);  
  305. //      }  
  306. //      Internet.post(Api.api_messageCreate, params,uploadFiles,new InternetCallback() {  
  307. //          @Override  
  308. //          public void callBack(int msgWhat, String api, String result) {  
  309. //              if(msgWhat==Internet.HTTP_STATUS_OK){  
  310. //                  //跟新数据  
  311. //                  adapter.notifyDataSetChanged();  
  312. //                  //显示没有数据  
  313. //              }else showToast("网络错误");  
  314. //          }  
  315. //      });  
  316.     }  
  317.       
  318.     /** 
  319.      * 第三方Apache集成POST 
  320.      * @param url api地址 
  321.      * @param mapParams 参数 
  322.      * @param callBack 
  323.      */  
  324.     public static void post3(final String url, final HashMap<String,String> mapParams,final HashMap<String,String> mapFileInfo,ConnInternetCallback callBack) {  
  325.         final Handler handler=getHandle(url , callBack);  
  326.         new Thread() {  
  327.             @Override  
  328.             public void run() {  
  329.                 Message msg=handler.obtainMessage(HTTP_STATUS_START, "开始连接");  
  330.                 try {  
  331.                     HttpPost httpPost = new HttpPost(url);  
  332.                     //多类型;  
  333.                     MultipartEntity multipartEntity = new MultipartEntity();    
  334.                     //字段  
  335.                     Iterator<?> it=mapParams.keySet().iterator();  
  336.                     while(it.hasNext()){  
  337.                         String key=(String) it.next();  
  338.                         String value=mapParams.get(key);  
  339.                         multipartEntity.addPart(key,new StringBody(value,Charset.forName("UTF-8")));  
  340.                     }  
  341.                     //文件  
  342.                     it=mapFileInfo.keySet().iterator();  
  343.                     while(it.hasNext()){  
  344.                         String key=(String)it.next();  
  345.                         String value=mapFileInfo.get(key);  
  346.                         multipartEntity.addPart(key, new FileBody(new File(value)));  
  347.                     }  
  348.                       
  349.                     httpPost.setEntity(multipartEntity);   
  350.                     HttpClient httpClient = new DefaultHttpClient();  
  351.                     HttpResponse httpResp = httpClient.execute(httpPost);  
  352.                       
  353.                     int resCode=httpResp.getStatusLine().getStatusCode();  
  354.                     if(resCode!=HTTP_STATUS_REULTOK){  
  355.                         msg.what=HTTP_STATUS_NORESP;  
  356.                         msg.obj=resCode;  
  357.                         handler.sendMessage(msg);  
  358.                         return ;  
  359.                     }  
  360.                     msg.what=HTTP_STATUS_REULTOK;  
  361.                     msg.obj= EntityUtils.toString(httpResp.getEntity());  
  362.                       
  363.                 }catch (Exception e) {  
  364.                     msg.what=HTTP_STATUS_ERROR;  
  365.                     msg.obj= e.getMessage();  
  366.                 }  
  367.                 finally{  
  368.                     handler.sendMessage(msg);  
  369.                 }  
  370.             }  
  371.         }.start();  
  372.     }  
  373.       
  374.     public static Bitmap loadBitmapFromNet(String imgUrl,BitmapFactory.Options options){  
  375.         Bitmap bitmap = null;  
  376.         URL imageUrl = null;  
  377.         if (imgUrl == null || imgUrl.length() == 0)     return null;  
  378.         try {  
  379.             imageUrl = new URL(imgUrl);  
  380.             URLConnection conn = imageUrl.openConnection();  
  381.             conn.setDoInput(true);  
  382.             conn.connect();  
  383.             InputStream is = conn.getInputStream();  
  384.             int length = conn.getContentLength();  
  385.             if (length != -1) {  
  386.                 byte[] imgData = new byte[length];  
  387.                 byte[] temp = new byte[512];  
  388.                 int readLen = 0;  
  389.                 int destPos = 0;  
  390.                 while ((readLen = is.read(temp)) != -1) {  
  391.                     System.arraycopy(temp, 0, imgData, destPos, readLen);  
  392.                     destPos += readLen;  
  393.                 }  
  394.                 bitmap = BitmapFactory.decodeByteArray(imgData, 0, imgData.length,options);  
  395.                 options.inJustDecodeBounds=false;  
  396.                 bitmap = BitmapFactory.decodeByteArray(imgData, 0, imgData.length,options);  
  397.             }  
  398.         } catch (IOException e) {  
  399.             return null;  
  400.         }  
  401.         return bitmap;  
  402.     }  
  403.       
  404.     public static void writeFileToOutStream(DataOutputStream outStream,String url){  
  405.         try {  
  406.             InputStream inputStream = new FileInputStream(new File(url));  
  407.             int ch;  
  408.             while((ch=inputStream.read())!=-1){  
  409.                 outStream.write(ch);  
  410.             }  
  411.             inputStream.close();  
  412.         }  
  413.         catch (Exception e) {  
  414.             e.printStackTrace();  
  415.         }  
  416.     }  
  417.       
  418.     public interface ConnInternetCallback{  
  419.         public void callBack(int msgWhat,String api,String result);  
  420.     }  
  421.       
  422.     public class ConnInternetUploadFile {  
  423.         private String filename;  
  424.         private String fileUrl;  
  425.         private String formname;  
  426.         private String contentType = "application/octet-stream";  
  427.                                                     //image/jpeg  
  428.         public ConnInternetUploadFile(String filename, String fileUrl, String formname) {  
  429.             this.filename = filename;  
  430.             this.fileUrl=fileUrl;  
  431.             this.formname = formname;  
  432.         }  
  433.   
  434.         public String getFileUrl() {  
  435.             return fileUrl;  
  436.         }  
  437.   
  438.         public void setFileUrl(String url) {  
  439.             this.fileUrl=url;  
  440.         }  
  441.   
  442.         public String getFileName() {  
  443.             return filename;  
  444.         }  
  445.   
  446.         public void setFileName(String filename) {  
  447.             this.filename = filename;  
  448.         }  
  449.   
  450.         public String getFormname() {  
  451.             return formname;  
  452.         }  
  453.   
  454.         public void setFormname(String formname) {  
  455.             this.formname = formname;  
  456.         }  
  457.   
  458.         public String getContentType() {  
  459.             return contentType;  
  460.         }  
  461.         public void setContentType(String contentType) {  
  462.             this.contentType = contentType;  
  463.         }  
  464.     }  
  465.   
  466. }  


2.Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件



简单的 Android 拍照并显示以及获取路径后上传

Activity 中的代码,我只贴出重要的事件部分代码

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void doPhoto(View view)  
  2. {  
  3.     destoryBimap();  
  4.     String state = Environment.getExternalStorageState();  
  5.     if (state.equals(Environment.MEDIA_MOUNTED)) {  
  6.         Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");  
  7.         startActivityForResult(intent, 1);  
  8.     } else {  
  9.         Toast.makeText(MainActivity.this"没有SD卡", Toast.LENGTH_LONG).show();  
  10.     }  
  11. }  
  12.   
  13. @Override  
  14. protected void onActivityResult(int requestCode, int resultCode, Intent data)  
  15. {  
  16.     Uri uri = data.getData();  
  17.     if (uri != null) {  
  18.         this.photo = BitmapFactory.decodeFile(uri.getPath());  
  19.     }  
  20.     if (this.photo == null) {  
  21.         Bundle bundle = data.getExtras();  
  22.         if (bundle != null) {  
  23.             this.photo = (Bitmap) bundle.get("data");  
  24.         } else {  
  25.             Toast.makeText(MainActivity.this"拍照失败", Toast.LENGTH_LONG).show();  
  26.             return;  
  27.         }  
  28.     }  
  29.   
  30.     FileOutputStream fileOutputStream = null;  
  31.     try {  
  32.         // 获取 SD 卡根目录  
  33.         String saveDir = Environment.getExternalStorageDirectory() + "/meitian_photos";  
  34.         // 新建目录  
  35.         File dir = new File(saveDir);  
  36.         if (! dir.exists()) dir.mkdir();  
  37.         // 生成文件名  
  38.         SimpleDateFormat t = new SimpleDateFormat("yyyyMMddssSSS");  
  39.         String filename = "MT" + (t.format(new Date())) + ".jpg";  
  40.         // 新建文件  
  41.         File file = new File(saveDir, filename);  
  42.         // 打开文件输出流  
  43.         fileOutputStream = new FileOutputStream(file);  
  44.         // 生成图片文件  
  45.         this.photo.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);  
  46.         // 相片的完整路径  
  47.         this.picPath = file.getPath();  
  48.         ImageView imageView = (ImageView) findViewById(R.id.showPhoto);  
  49.         imageView.setImageBitmap(this.photo);  
  50.     } catch (Exception e) {  
  51.         e.printStackTrace();  
  52.     } finally {  
  53.         if (fileOutputStream != null) {  
  54.             try {  
  55.                 fileOutputStream.close();  
  56.             } catch (Exception e) {  
  57.                 e.printStackTrace();  
  58.             }  
  59.         }  
  60.     }  
  61. }  
  62.   
  63. /** 
  64.  * 销毁图片文件 
  65.  */  
  66. private void destoryBimap()  
  67. {  
  68.     if (photo != null && ! photo.isRecycled()) {  
  69.         photo.recycle();  
  70.         photo = null;  
  71.     }  
  72. }  


Layout 布局页面

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical"  
  5.     >  
  6.     <ScrollView  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         >  
  10.         <LinearLayout  
  11.             android:layout_width="fill_parent"  
  12.             android:layout_height="fill_parent"  
  13.             android:orientation="vertical"  
  14.             >  
  15.             <Button  
  16.                 android:id="@+id/doPhoto"  
  17.                 android:layout_width="fill_parent"  
  18.                 android:layout_height="wrap_content"  
  19.                 android:padding="10dp"  
  20.                 android:layout_marginBottom="10dp"  
  21.                 android:text="拍照"  
  22.                 android:onClick="doPhoto"  
  23.                 />  
  24.             <TextView  
  25.                 android:id="@+id/showContent"  
  26.                 android:layout_width="fill_parent"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:layout_marginBottom="10dp"  
  29.                 />  
  30.             <ImageView  
  31.                 android:id="@+id/showPhoto"  
  32.                 android:layout_width="fill_parent"  
  33.                 android:layout_height="250dp"  
  34.                 android:scaleType="centerCrop"  
  35.                 android:src="@drawable/add"  
  36.                 android:layout_marginBottom="10dp"  
  37.                 />  
  38.         </LinearLayout>  
  39.     </ScrollView>  
  40. </LinearLayout>  



折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧。

其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine4.3 发现网上很多 MultipartEntity 相关的文章都是早起版本的,以前的一些方法虽然还可用,但新版本中已经不建议使用了,所以全部使用新的方式 MultipartEntityBuilder 来处理了。

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. httpmime-4.3.2.jar    
  2. httpcore-4.3.1.jar   


下载地址:http://hc.apache.org/downloads.cgi

有些镜像貌似打不开,页面上可以可以选择国内的 .cn 后缀的域名镜像服务器来下载


如果是 android studio 这里可能会遇到一个问题:Android Duplicate files copied in APK


经测试 POST 对中文处理也是正常的,没有发现乱码

下面是完整代码:

ZHttpRequest.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.ai9475.util;  
  2.   
  3. import org.apache.http.HttpEntity;  
  4. import org.apache.http.HttpResponse;  
  5. import org.apache.http.HttpStatus;  
  6. import org.apache.http.client.HttpClient;  
  7. import org.apache.http.client.methods.HttpGet;  
  8. import org.apache.http.client.methods.HttpPost;  
  9. import org.apache.http.client.methods.HttpRequestBase;  
  10. import org.apache.http.entity.ContentType;  
  11. import org.apache.http.entity.mime.HttpMultipartMode;  
  12. import org.apache.http.entity.mime.MultipartEntityBuilder;  
  13. import org.apache.http.impl.client.DefaultHttpClient;  
  14. import org.apache.http.params.BasicHttpParams;  
  15. import org.apache.http.params.HttpConnectionParams;  
  16. import org.apache.http.params.HttpParams;  
  17. import org.apache.http.protocol.HTTP;  
  18.   
  19. import java.io.ByteArrayOutputStream;  
  20. import java.io.File;  
  21. import java.io.IOException;  
  22. import java.io.InputStream;  
  23. import java.io.UnsupportedEncodingException;  
  24. import java.nio.charset.Charset;  
  25. import java.util.Iterator;  
  26. import java.util.Map;  
  27. import java.util.Set;  
  28.   
  29. /** 
  30.  * Created by ZHOUZ on 14-2-3. 
  31.  */  
  32. public class ZHttpRequest  
  33. {  
  34.     protected String url = "";  
  35.   
  36.     protected Map<String, String> headers = null;  
  37.   
  38.     protected int connectionTimeout = 5000;  
  39.   
  40.     protected int soTimeout = 10000;  
  41.   
  42.     protected int statusCode = 200;  
  43.   
  44.     protected String charset = HTTP.UTF_8;  
  45.   
  46.     protected HttpGet httpGet;  
  47.   
  48.     protected HttpPost httpPost;  
  49.   
  50.     protected HttpParams httpParameters;  
  51.   
  52.     protected HttpResponse httpResponse;  
  53.   
  54.     protected HttpClient httpClient;  
  55.   
  56.     protected String inputContent;  
  57.   
  58.     /** 
  59.      * 设置当前请求的链接 
  60.      * 
  61.      * @param url 
  62.      * @return 
  63.      */  
  64.     public ZHttpRequest setUrl(String url)  
  65.     {  
  66.         this.url = url;  
  67.         return this;  
  68.     }  
  69.   
  70.     /** 
  71.      * 设置请求的 header 信息 
  72.      * 
  73.      * @param headers 
  74.      * @return 
  75.      */  
  76.     public ZHttpRequest setHeaders(Map headers)  
  77.     {  
  78.         this.headers = headers;  
  79.         return this;  
  80.     }  
  81.   
  82.     /** 
  83.      * 设置连接超时时间 
  84.      * 
  85.      * @param timeout 单位(毫秒),默认 5000 
  86.      * @return 
  87.      */  
  88.     public ZHttpRequest setConnectionTimeout(int timeout)  
  89.     {  
  90.         this.connectionTimeout = timeout;  
  91.         return this;  
  92.     }  
  93.   
  94.     /** 
  95.      * 设置 socket 读取超时时间 
  96.      * 
  97.      * @param timeout 单位(毫秒),默认 10000 
  98.      * @return 
  99.      */  
  100.     public ZHttpRequest setSoTimeout(int timeout)  
  101.     {  
  102.         this.soTimeout = timeout;  
  103.         return this;  
  104.     }  
  105.   
  106.     /** 
  107.      * 设置获取内容的编码格式 
  108.      * 
  109.      * @param charset 默认为 UTF-8 
  110.      * @return 
  111.      */  
  112.     public ZHttpRequest setCharset(String charset)  
  113.     {  
  114.         this.charset = charset;  
  115.         return this;  
  116.     }  
  117.   
  118.     /** 
  119.      * 获取 HTTP 请求响应信息 
  120.      * 
  121.      * @return 
  122.      */  
  123.     public HttpResponse getHttpResponse()  
  124.     {  
  125.         return this.httpResponse;  
  126.     }  
  127.   
  128.     /** 
  129.      * 获取 HTTP 客户端连接管理器 
  130.      * 
  131.      * @return 
  132.      */  
  133.     public HttpClient getHttpClient()  
  134.     {  
  135.         return this.httpClient;  
  136.     }  
  137.   
  138.     /** 
  139.      * 获取请求的状态码 
  140.      * 
  141.      * @return 
  142.      */  
  143.     public int getStatusCode()  
  144.     {  
  145.         return this.statusCode;  
  146.     }  
  147.   
  148.     /** 
  149.      * 通过 GET 方式请求数据 
  150.      * 
  151.      * @param url 
  152.      * @return 
  153.      * @throws IOException 
  154.      */  
  155.     public String get(String url) throws IOException  
  156.     {  
  157.         // 设置当前请求的链接  
  158.         this.setUrl(url);  
  159.         // 实例化 GET 连接  
  160.         this.httpGet = new HttpGet(this.url);  
  161.         // 自定义配置 header 信息  
  162.         this.addHeaders(this.httpGet);  
  163.         // 初始化客户端请求  
  164.         this.initHttpClient();  
  165.         // 发送 HTTP 请求  
  166.         this.httpResponse = this.httpClient.execute(this.httpGet);  
  167.         // 读取远程数据  
  168.         this.getInputStream();  
  169.         // 远程请求状态码是否正常  
  170.         if (this.statusCode != HttpStatus.SC_OK) {  
  171.             return null;  
  172.         }  
  173.         // 返回全部读取到的字符串  
  174.         return this.inputContent;  
  175.     }  
  176.   
  177.     public String post(String url, Map<String, String> datas, Map<String, String> files) throws IOException  
  178.     {  
  179.         this.setUrl(url);  
  180.         // 实例化 GET 连接  
  181.         this.httpPost = new HttpPost(this.url);  
  182.         // 自定义配置 header 信息  
  183.         this.addHeaders(this.httpPost);  
  184.         // 初始化客户端请求  
  185.         this.initHttpClient();  
  186.         Iterator iterator = datas.entrySet().iterator();  
  187.         MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();  
  188.         multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);  
  189.         multipartEntityBuilder.setCharset(Charset.forName(this.charset));  
  190.         // 发送的数据  
  191.         while (iterator.hasNext()) {  
  192.             Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();  
  193.             multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), ContentType.create("text/plain", Charset.forName(this.charset)));  
  194.         }  
  195.         // 发送的文件  
  196.         if (files != null) {  
  197.             iterator = files.entrySet().iterator();  
  198.             while (iterator.hasNext()) {  
  199.                 Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();  
  200.                 String path = entry.getValue();  
  201.                 if ("".equals(path) || path == nullcontinue;  
  202.                 File file = new File(entry.getValue());  
  203.                 multipartEntityBuilder.addBinaryBody(entry.getKey(), file);  
  204.             }  
  205.         }  
  206.         // 生成 HTTP 实体  
  207.         HttpEntity httpEntity = multipartEntityBuilder.build();  
  208.         // 设置 POST 请求的实体部分  
  209.         this.httpPost.setEntity(httpEntity);  
  210.         // 发送 HTTP 请求  
  211.         this.httpResponse = this.httpClient.execute(this.httpPost);  
  212.         // 读取远程数据  
  213.         this.getInputStream();  
  214.         // 远程请求状态码是否正常  
  215.         if (this.statusCode != HttpStatus.SC_OK) {  
  216.             return null;  
  217.         }  
  218.         // 返回全部读取到的字符串  
  219.         return this.inputContent.toString();  
  220.     }  
  221.   
  222.     /** 
  223.      * 为 HTTP 请求添加 header 信息 
  224.      * 
  225.      * @param request 
  226.      */  
  227.     protected void addHeaders(HttpRequestBase request)  
  228.     {  
  229.         if (this.headers != null) {  
  230.             Set keys = this.headers.entrySet();  
  231.             Iterator iterator = keys.iterator();  
  232.             Map.Entry<String, String> entry;  
  233.             while (iterator.hasNext()) {  
  234.                 entry = (Map.Entry<String, String>) iterator.next();  
  235.                 request.addHeader(entry.getKey().toString(), entry.getValue().toString());  
  236.             }  
  237.         }  
  238.     }  
  239.   
  240.     /** 
  241.      * 配置请求参数 
  242.      */  
  243.     protected void setParams()  
  244.     {  
  245.         this.httpParameters = new BasicHttpParams();  
  246.         this.httpParameters.setParameter("charset"this.charset);  
  247.         // 设置 连接请求超时时间  
  248.         HttpConnectionParams.setConnectionTimeout(this.httpParameters, this.connectionTimeout);  
  249.         // 设置 socket 读取超时时间  
  250.         HttpConnectionParams.setSoTimeout(this.httpParameters, this.soTimeout);  
  251.     }  
  252.   
  253.     /** 
  254.      * 初始化配置客户端请求 
  255.      */  
  256.     protected void initHttpClient()  
  257.     {  
  258.         // 配置 HTTP 请求参数  
  259.         this.setParams();  
  260.         // 开启一个客户端 HTTP 请求  
  261.         this.httpClient = new DefaultHttpClient(this.httpParameters);  
  262.     }  
  263.   
  264.     /** 
  265.      * 读取远程数据 
  266.      * 
  267.      * @throws IOException 
  268.      */  
  269.     protected void getInputStream() throws IOException  
  270.     {  
  271.         // 接收远程输入流  
  272.         InputStream inStream = this.httpResponse.getEntity().getContent();  
  273.         // 分段读取输入流数据  
  274.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  275.         byte[] buf = new byte[1024];  
  276.         int len = -1;  
  277.         while ((len = inStream.read(buf)) != -1) {  
  278.             baos.write(buf, 0, len);  
  279.         }  
  280.         // 将数据转换为字符串保存  
  281.         this.inputContent = new String(baos.toByteArray());  
  282.         // 数据接收完毕退出  
  283.         inStream.close();  
  284.         // 获取请求返回的状态码  
  285.         this.statusCode = this.httpResponse.getStatusLine().getStatusCode();  
  286.     }  
  287.   
  288.     /** 
  289.      * 关闭连接管理器释放资源 
  290.      */  
  291.     protected void shutdownHttpClient()  
  292.     {  
  293.         if (this.httpClient != null && this.httpClient.getConnectionManager() != null) {  
  294.             this.httpClient.getConnectionManager().shutdown();  
  295.         }  
  296.     }  
  297. }  

MainActivity.java

这个我就只写事件部分了

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void doClick(View view)  
  2. {  
  3.     ZHttpRequest request = new ZHttpRequest();  
  4.     String url = "";  
  5.     TextView textView = (TextView) findViewById(R.id.showContent);  
  6.     String content = "空内容";  
  7.     try {  
  8.         if (view.getId() == R.id.doGet) {  
  9.             url = "http://www.baidu.com";  
  10.             content = "GET数据:" + request.get(url);  
  11.         } else {  
  12.             url = "http://192.168.1.6/test.php";  
  13.             HashMap<String, String> datas = new HashMap<String, String>();  
  14.             datas.put("p1""abc");  
  15.             datas.put("p2""中文");  
  16.             datas.put("p3""abc中文cba");  
  17.             datas.put("pic"this.picPath);  
  18.             HashMap<String, String> files = new HashMap<String, String>();  
  19.             files.put("file"this.picPath);  
  20.             content = "POST数据:" + request.post(url, datas, files);  
  21.         }  
  22.   
  23.     } catch (IOException e) {  
  24.         content = "IO异常:" + e.getMessage();  
  25.     } catch (Exception e) {  
  26.         content = "异常:" + e.getMessage();  
  27.     }  
  28.     textView.setText(content);  
  29. }  

其中的 this.picPath 就是指定的SD卡中的相片路径 String 类型


activity_main.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical"  
  5.     >  
  6.     <ScrollView  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         >  
  10.         <LinearLayout  
  11.             android:layout_width="fill_parent"  
  12.             android:layout_height="fill_parent"  
  13.             android:orientation="vertical"  
  14.             >  
  15.             <Button  
  16.                 android:id="@+id/doGet"  
  17.                 android:layout_width="fill_parent"  
  18.                 android:layout_height="wrap_content"  
  19.                 android:padding="10dp"  
  20.                 android:layout_marginBottom="10dp"  
  21.                 android:text="GET请求"  
  22.                 android:onClick="doClick"  
  23.                 />  
  24.             <Button  
  25.                 android:id="@+id/doPost"  
  26.                 android:layout_width="fill_parent"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:padding="10dp"  
  29.                 android:layout_marginBottom="10dp"  
  30.                 android:text="POST请求"  
  31.                 android:onClick="doClick"  
  32.                 />  
  33.             <Button  
  34.                 android:id="@+id/doPhoto"  
  35.                 android:layout_width="fill_parent"  
  36.                 android:layout_height="wrap_content"  
  37.                 android:padding="10dp"  
  38.                 android:layout_marginBottom="10dp"  
  39.                 android:text="拍照"  
  40.                 android:onClick="doPhoto"  
  41.                 />  
  42.             <ImageView  
  43.                 android:id="@+id/showPhoto"  
  44.                 android:layout_width="fill_parent"  
  45.                 android:layout_height="250dp"  
  46.                 android:scaleType="centerCrop"  
  47.                 android:src="@drawable/add"  
  48.                 android:layout_marginBottom="10dp"  
  49.                 />  
  50.             <TextView  
  51.                 android:id="@+id/showContent"  
  52.                 android:layout_width="fill_parent"  
  53.                 android:layout_height="wrap_content"  
  54.                 android:layout_marginBottom="10dp"  
  55.                 />  
  56.         </LinearLayout>  
  57.     </ScrollView>  
  58. </LinearLayout>  


Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)


Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版

上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改过了,现在应用更加方便点

http://blog.csdn.net/zhouzme/article/details/18940279


直接上代码了:

ZHttpRequset.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.ai9475.util;  
  2.   
  3. import org.apache.http.HttpEntity;  
  4. import org.apache.http.HttpResponse;  
  5. import org.apache.http.HttpStatus;  
  6. import org.apache.http.client.HttpClient;  
  7. import org.apache.http.client.methods.HttpGet;  
  8. import org.apache.http.client.methods.HttpPost;  
  9. import org.apache.http.client.methods.HttpRequestBase;  
  10. import org.apache.http.entity.mime.HttpMultipartMode;  
  11. import org.apache.http.entity.mime.MultipartEntityBuilder;  
  12. import org.apache.http.impl.client.DefaultHttpClient;  
  13. import org.apache.http.params.BasicHttpParams;  
  14. import org.apache.http.params.HttpConnectionParams;  
  15. import org.apache.http.params.HttpParams;  
  16. import org.apache.http.protocol.HTTP;  
  17.   
  18. import java.io.ByteArrayOutputStream;  
  19. import java.io.IOException;  
  20. import java.io.InputStream;  
  21. import java.nio.charset.Charset;  
  22.   
  23. /** 
  24.  * Created by ZHOUZ on 14-2-3. 
  25.  */  
  26. public class ZHttpRequest  
  27. {  
  28.     public final String HTTP_GET = "GET";  
  29.   
  30.     public final String HTTP_POST = "POST";  
  31.   
  32.     /** 
  33.      * 当前请求的 URL 
  34.      */  
  35.     protected String url = "";  
  36.   
  37.     /** 
  38.      * HTTP 请求的类型 
  39.      */  
  40.     protected String requsetType = HTTP_GET;  
  41.   
  42.     /** 
  43.      * 连接请求的超时时间 
  44.      */  
  45.     protected int connectionTimeout = 5000;  
  46.   
  47.     /** 
  48.      * 读取远程数据的超时时间 
  49.      */  
  50.     protected int soTimeout = 10000;  
  51.   
  52.     /** 
  53.      * 服务端返回的状态码 
  54.      */  
  55.     protected int statusCode = -1;  
  56.   
  57.     /** 
  58.      * 当前链接的字符编码 
  59.      */  
  60.     protected String charset = HTTP.UTF_8;  
  61.   
  62.     /** 
  63.      * HTTP GET 请求管理器 
  64.      */  
  65.     protected HttpRequestBase httpRequest= null;  
  66.   
  67.     /** 
  68.      * HTTP 请求的配置参数 
  69.      */  
  70.     protected HttpParams httpParameters= null;  
  71.   
  72.     /** 
  73.      * HTTP 请求响应 
  74.      */  
  75.     protected HttpResponse httpResponse= null;  
  76.   
  77.     /** 
  78.      * HTTP 客户端连接管理器 
  79.      */  
  80.     protected HttpClient httpClient= null;  
  81.   
  82.     /** 
  83.      * HTTP POST 方式发送多段数据管理器 
  84.      */  
  85.     protected MultipartEntityBuilder multipartEntityBuilder= null;  
  86.   
  87.     /** 
  88.      * 绑定 HTTP 请求的事件监听器 
  89.      */  
  90.     protected OnHttpRequestListener onHttpRequestListener = null;  
  91.   
  92.     public ZHttpRequest(){}  
  93.   
  94.     public ZHttpRequest(OnHttpRequestListener listener) {  
  95.         this.setOnHttpRequestListener(listener);  
  96.     }  
  97.   
  98.     /** 
  99.      * 设置当前请求的链接 
  100.      * 
  101.      * @param url 
  102.      * @return 
  103.      */  
  104.     public ZHttpRequest setUrl(String url)  
  105.     {  
  106.         this.url = url;  
  107.         return this;  
  108.     }  
  109.   
  110.     /** 
  111.      * 设置连接超时时间 
  112.      * 
  113.      * @param timeout 单位(毫秒),默认 5000 
  114.      * @return 
  115.      */  
  116.     public ZHttpRequest setConnectionTimeout(int timeout)  
  117.     {  
  118.         this.connectionTimeout = timeout;  
  119.         return this;  
  120.     }  
  121.   
  122.     /** 
  123.      * 设置 socket 读取超时时间 
  124.      * 
  125.      * @param timeout 单位(毫秒),默认 10000 
  126.      * @return 
  127.      */  
  128.     public ZHttpRequest setSoTimeout(int timeout)  
  129.     {  
  130.         this.soTimeout = timeout;  
  131.         return this;  
  132.     }  
  133.   
  134.     /** 
  135.      * 设置获取内容的编码格式 
  136.      * 
  137.      * @param charset 默认为 UTF-8 
  138.      * @return 
  139.      */  
  140.     public ZHttpRequest setCharset(String charset)  
  141.     {  
  142.         this.charset = charset;  
  143.         return this;  
  144.     }  
  145.   
  146.     /** 
  147.      * 获取当前 HTTP 请求的类型 
  148.      * 
  149.      * @return 
  150.      */  
  151.     public String getRequestType()  
  152.     {  
  153.         return this.requsetType;  
  154.     }  
  155.   
  156.     /** 
  157.      * 判断当前是否 HTTP GET 请求 
  158.      * 
  159.      * @return 
  160.      */  
  161.     public boolean isGet()  
  162.     {  
  163.         return this.requsetType == HTTP_GET;  
  164.     }  
  165.   
  166.     /** 
  167.      * 判断当前是否 HTTP POST 请求 
  168.      * 
  169.      * @return 
  170.      */  
  171.     public boolean isPost()  
  172.     {  
  173.         return this.requsetType == HTTP_POST;  
  174.     }  
  175.   
  176.     /** 
  177.      * 获取 HTTP 请求响应信息 
  178.      * 
  179.      * @return 
  180.      */  
  181.     public HttpResponse getHttpResponse()  
  182.     {  
  183.         return this.httpResponse;  
  184.     }  
  185.   
  186.     /** 
  187.      * 获取 HTTP 客户端连接管理器 
  188.      * 
  189.      * @return 
  190.      */  
  191.     public HttpClient getHttpClient()  
  192.     {  
  193.         return this.httpClient;  
  194.     }  
  195.   
  196.     /** 
  197.      * 添加一条 HTTP 请求的 header 信息 
  198.      * 
  199.      * @param name 
  200.      * @param value 
  201.      * @return 
  202.      */  
  203.     public ZHttpRequest addHeader(String name, String value)  
  204.     {  
  205.         this.httpRequest.addHeader(name, value);  
  206.         return this;  
  207.     }  
  208.   
  209.     /** 
  210.      * 获取 HTTP GET 控制器 
  211.      * 
  212.      * @return 
  213.      */  
  214.     public HttpGet getHttpGet()  
  215.     {  
  216.         return (HttpGet) this.httpRequest;  
  217.     }  
  218.   
  219.     /** 
  220.      * 获取 HTTP POST 控制器 
  221.      * 
  222.      * @return 
  223.      */  
  224.     public HttpPost getHttpPost()  
  225.     {  
  226.         return (HttpPost) this.httpRequest;  
  227.     }  
  228.   
  229.     /** 
  230.      * 获取请求的状态码 
  231.      * 
  232.      * @return 
  233.      */  
  234.     public int getStatusCode()  
  235.     {  
  236.         return this.statusCode;  
  237.     }  
  238.   
  239.     /** 
  240.      * 通过 GET 方式请求数据 
  241.      * 
  242.      * @param url 
  243.      * @return 
  244.      * @throws IOException 
  245.      */  
  246.     public String get(String url) throws Exception  
  247.     {  
  248.         this.requsetType = HTTP_GET;  
  249.         // 设置当前请求的链接  
  250.         this.setUrl(url);  
  251.         // 新建 HTTP GET 请求  
  252.         this.httpRequest = new HttpGet(this.url);  
  253.         // 执行客户端请求  
  254.         this.httpClientExecute();  
  255.         // 监听服务端响应事件并返回服务端内容  
  256.         return this.checkStatus();  
  257.     }  
  258.   
  259.     /** 
  260.      * 获取 HTTP POST 多段数据提交管理器 
  261.      * 
  262.      * @return 
  263.      */  
  264.     public MultipartEntityBuilder getMultipartEntityBuilder()  
  265.     {  
  266.         if (this.multipartEntityBuilder == null) {  
  267.             this.multipartEntityBuilder = MultipartEntityBuilder.create();  
  268.             // 设置为浏览器兼容模式  
  269.             multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);  
  270.             // 设置请求的编码格式  
  271.             multipartEntityBuilder.setCharset(Charset.forName(this.charset));  
  272.         }  
  273.         return this.multipartEntityBuilder;  
  274.     }  
  275.   
  276.     /** 
  277.      * 配置完要 POST 提交的数据后, 执行该方法生成数据实体等待发送 
  278.      */  
  279.     public void buildPostEntity()  
  280.     {  
  281.         // 生成 HTTP POST 实体  
  282.         HttpEntity httpEntity = this.multipartEntityBuilder.build();  
  283.         this.getHttpPost().setEntity(httpEntity);  
  284.     }  
  285.   
  286.     /** 
  287.      * 发送 POST 请求 
  288.      * 
  289.      * @param url 
  290.      * @return 
  291.      * @throws Exception 
  292.      */  
  293.     public String post(String url) throws Exception  
  294.     {  
  295.         this.requsetType = HTTP_POST;  
  296.         // 设置当前请求的链接  
  297.         this.setUrl(url);  
  298.         // 新建 HTTP POST 请求  
  299.         this.httpRequest = new HttpPost(this.url);  
  300.         // 执行客户端请求  
  301.         this.httpClientExecute();  
  302.         // 监听服务端响应事件并返回服务端内容  
  303.         return this.checkStatus();  
  304.     }  
  305.   
  306.     /** 
  307.      * 执行 HTTP 请求 
  308.      * 
  309.      * @throws Exception 
  310.      */  
  311.     protected void httpClientExecute() throws Exception  
  312.     {  
  313.         // 配置 HTTP 请求参数  
  314.         this.httpParameters = new BasicHttpParams();  
  315.         this.httpParameters.setParameter("charset"this.charset);  
  316.         // 设置 连接请求超时时间  
  317.         HttpConnectionParams.setConnectionTimeout(this.httpParameters, this.connectionTimeout);  
  318.         // 设置 socket 读取超时时间  
  319.         HttpConnectionParams.setSoTimeout(this.httpParameters, this.soTimeout);  
  320.         // 开启一个客户端 HTTP 请求  
  321.         this.httpClient = new DefaultHttpClient(this.httpParameters);  
  322.         // 启动 HTTP POST 请求执行前的事件监听回调操作(如: 自定义提交的数据字段或上传的文件等)  
  323.         this.getOnHttpRequestListener().onRequest(this);  
  324.         // 发送 HTTP 请求并获取服务端响应状态  
  325.         this.httpResponse = this.httpClient.execute(this.httpRequest);  
  326.         // 获取请求返回的状态码  
  327.         this.statusCode = this.httpResponse.getStatusLine().getStatusCode();  
  328.     }  
  329.   
  330.     /** 
  331.      * 读取服务端返回的输入流并转换成字符串返回 
  332.      * 
  333.      * @throws Exception 
  334.      */  
  335.     public String getInputStream() throws Exception  
  336.     {  
  337.         // 接收远程输入流  
  338.         InputStream inStream = this.httpResponse.getEntity().getContent();  
  339.         // 分段读取输入流数据  
  340.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  341.         byte[] buf = new byte[1024];  
  342.         int len = -1;  
  343.         while ((len = inStream.read(buf)) != -1) {  
  344.             baos.write(buf, 0, len);  
  345.         }  
  346.         // 数据接收完毕退出  
  347.         inStream.close();  
  348.         // 将数据转换为字符串保存  
  349.         return new String(baos.toByteArray(), this.charset);  
  350.     }  
  351.   
  352.     /** 
  353.      * 关闭连接管理器释放资源 
  354.      */  
  355.     protected void shutdownHttpClient()  
  356.     {  
  357.         if (this.httpClient != null && this.httpClient.getConnectionManager() != null) {  
  358.             this.httpClient.getConnectionManager().shutdown();  
  359.         }  
  360.     }  
  361.   
  362.     /** 
  363.      * 监听服务端响应事件并返回服务端内容 
  364.      * 
  365.      * @return 
  366.      * @throws Exception 
  367.      */  
  368.     protected String checkStatus() throws Exception  
  369.     {  
  370.         OnHttpRequestListener listener = this.getOnHttpRequestListener();  
  371.         String content;  
  372.         if (this.statusCode == HttpStatus.SC_OK) {  
  373.             // 请求成功, 回调监听事件  
  374.             content = listener.onSucceed(this.statusCode, this);  
  375.         } else {  
  376.             // 请求失败或其他, 回调监听事件  
  377.             content = listener.onFailed(this.statusCode, this);  
  378.         }  
  379.         // 关闭连接管理器释放资源  
  380.         this.shutdownHttpClient();  
  381.         return content;  
  382.     }  
  383.   
  384.     /** 
  385.      * HTTP 请求操作时的事件监听接口 
  386.      */  
  387.     public interface OnHttpRequestListener  
  388.     {  
  389.         /** 
  390.          * 初始化 HTTP GET 或 POST 请求之前的 header 信息配置 或 其他数据配置等操作 
  391.          * 
  392.          * @param request 
  393.          * @throws Exception 
  394.          */  
  395.         public void onRequest(ZHttpRequest request) throws Exception;  
  396.   
  397.         /** 
  398.          * 当 HTTP 请求响应成功时的回调方法 
  399.          * 
  400.          * @param statusCode 当前状态码 
  401.          * @param request 
  402.          * @return 返回请求获得的字符串内容 
  403.          * @throws Exception 
  404.          */  
  405.         public String onSucceed(int statusCode, ZHttpRequest request) throws Exception;  
  406.   
  407.         /** 
  408.          * 当 HTTP 请求响应失败时的回调方法 
  409.          * 
  410.          * @param statusCode 当前状态码 
  411.          * @param request 
  412.          * @return 返回请求失败的提示内容 
  413.          * @throws Exception 
  414.          */  
  415.         public String onFailed(int statusCode, ZHttpRequest request) throws Exception;  
  416.     }  
  417.   
  418.     /** 
  419.      * 绑定 HTTP 请求的监听事件 
  420.      * 
  421.      * @param listener 
  422.      * @return 
  423.      */  
  424.     public ZHttpRequest setOnHttpRequestListener(OnHttpRequestListener listener)  
  425.     {  
  426.         this.onHttpRequestListener = listener;  
  427.         return this;  
  428.     }  
  429.   
  430.     /** 
  431.      * 获取已绑定过的 HTTP 请求监听事件 
  432.      * 
  433.      * @return 
  434.      */  
  435.     public OnHttpRequestListener getOnHttpRequestListener()  
  436.     {  
  437.         return this.onHttpRequestListener;  
  438.     }  
  439. }  

在 Activity 中的使用方法(这里我还是只写主体部分代码):

MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void doClick(View view)  
  2. {  
  3.     ZHttpRequest get = new ZHttpRequest();  
  4.     get  
  5.             .setCharset(HTTP.UTF_8)  
  6.             .setConnectionTimeout(5000)  
  7.             .setSoTimeout(5000);  
  8.     get.setOnHttpRequestListener(new ZHttpRequest.OnHttpRequestListener() {  
  9.         @Override  
  10.         public void onRequest(ZHttpRequest request) throws Exception {  
  11.   
  12.         }  
  13.   
  14.         @Override  
  15.         public String onSucceed(int statusCode, ZHttpRequest request) throws Exception {  
  16.             return request.getInputStream();  
  17.         }  
  18.   
  19.         @Override  
  20.         public String onFailed(int statusCode, ZHttpRequest request) throws Exception {  
  21.             return "GET 请求失败:statusCode "+ statusCode;  
  22.         }  
  23.     });  
  24.   
  25.     ZHttpRequest post = new ZHttpRequest();  
  26.     post  
  27.             .setCharset(HTTP.UTF_8)  
  28.             .setConnectionTimeout(5000)  
  29.             .setSoTimeout(10000);  
  30.     post.setOnHttpRequestListener(new ZHttpRequest.OnHttpRequestListener() {  
  31.         private String CHARSET = HTTP.UTF_8;  
  32.         private ContentType TEXT_PLAIN = ContentType.create("text/plain", Charset.forName(CHARSET));  
  33.   
  34.         @Override  
  35.         public void onRequest(ZHttpRequest request) throws Exception {  
  36.             // 设置发送请求的 header 信息  
  37.             request.addHeader("cookie""abc=123;456=爱就是幸福;");  
  38.             // 配置要 POST 的数据  
  39.             MultipartEntityBuilder builder = request.getMultipartEntityBuilder();  
  40.             builder.addTextBody("p1""abc");  
  41.             builder.addTextBody("p2""中文", TEXT_PLAIN);  
  42.             builder.addTextBody("p3""abc中文cba", TEXT_PLAIN);  
  43.             if (picPath != null && ! "".equals(picPath)) {  
  44.                 builder.addTextBody("pic", picPath);  
  45.                 builder.addBinaryBody("file"new File(picPath));  
  46.             }  
  47.             request.buildPostEntity();  
  48.         }  
  49.   
  50.         @Override  
  51.         public String onSucceed(int statusCode, ZHttpRequest request) throws Exception {  
  52.             return request.getInputStream();  
  53.         }  
  54.   
  55.         @Override  
  56.         public String onFailed(int statusCode, ZHttpRequest request) throws Exception {  
  57.             return "POST 请求失败:statusCode "+ statusCode;  
  58.         }  
  59.     });  
  60.   
  61.     TextView textView = (TextView) findViewById(R.id.showContent);  
  62.     String content = "初始内容";  
  63.     try {  
  64.         if (view.getId() == R.id.doGet) {  
  65.             content = get.get("http://www.baidu.com");  
  66.             content = "GET数据:isGet: " + (get.isGet() ? "yes" : "no") + " =>" + content;  
  67.         } else {  
  68.             content = post.post("http://192.168.1.6/test.php");  
  69.             content = "POST数据:isPost" + (post.isPost() ? "yes" : "no") + " =>" + content;  
  70.         }  
  71.   
  72.     } catch (IOException e) {  
  73.         content = "IO异常:" + e.getMessage();  
  74.     } catch (Exception e) {  
  75.         content = "异常:" + e.getMessage();  
  76.     }  
  77.     textView.setText(content);  
  78. }  

其中 picPath 为 SD 卡中的图片路径 String 类型,我是直接拍照后进行上传用的

关于拍照显示并上传的代码部分:http://blog.csdn.net/zhouzme/article/details/18952201


布局页面

activity_main.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical"  
  5.     >  
  6.     <ScrollView  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         >  
  10.         <LinearLayout  
  11.             android:layout_width="fill_parent"  
  12.             android:layout_height="fill_parent"  
  13.             android:orientation="vertical"  
  14.             >  
  15.             <Button  
  16.                 android:id="@+id/doGet"  
  17.                 android:layout_width="fill_parent"  
  18.                 android:layout_height="wrap_content"  
  19.                 android:padding="10dp"  
  20.                 android:layout_marginBottom="10dp"  
  21.                 android:text="GET请求"  
  22.                 android:onClick="doClick"  
  23.                 />  
  24.             <Button  
  25.                 android:id="@+id/doPost"  
  26.                 android:layout_width="fill_parent"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:padding="10dp"  
  29.                 android:layout_marginBottom="10dp"  
  30.                 android:text="POST请求"  
  31.                 android:onClick="doClick"  
  32.                 />  
  33.             <Button  
  34.                 android:id="@+id/doPhoto"  
  35.                 android:layout_width="fill_parent"  
  36.                 android:layout_height="wrap_content"  
  37.                 android:padding="10dp"  
  38.                 android:layout_marginBottom="10dp"  
  39.                 android:text="拍照"  
  40.                 android:onClick="doPhoto"  
  41.                 />  
  42.             <TextView  
  43.                 android:id="@+id/showContent"  
  44.                 android:layout_width="fill_parent"  
  45.                 android:layout_height="wrap_content"  
  46.                 android:layout_marginBottom="10dp"  
  47.                 />  
  48.             <ImageView  
  49.                 android:id="@+id/showPhoto"  
  50.                 android:layout_width="fill_parent"  
  51.                 android:layout_height="250dp"  
  52.                 android:scaleType="centerCrop"  
  53.                 android:src="@drawable/add"  
  54.                 android:layout_marginBottom="10dp"  
  55.                 />  
  56.         </LinearLayout>  
  57.     </ScrollView>  
  58. </LinearLayout>  

至于服务端我用的 PHP ,只是简单的输出获取到的数据而已

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. echo 'GET:<br>'"\n";  
  3. //print_r(array_map('urldecode', $_GET));  
  4. print_r($_GET);  
  5. echo '<br>'"\n"'POST:<br>'"\n";  
  6. //print_r(array_map('urldecode', $_POST));  
  7. print_r($_POST);  
  8. echo '<br>'"\n"'FILES:<br>'"\n";  
  9. print_r($_FILES);  
  10. echo '<br>'"\n"'COOKIES:<br>'"\n";  
  11. print_r($_COOKIE);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值