Android开发笔记(六十三)HTTP访问的通信方式
2016-02-14 14:19
666 查看
InputStream和OutputStream
输入输出流在java中很常用,从文件读写到内存读写到网络通信都会用到。在之前的《Android开发笔记(三十三)文本文件和图片文件的读写》中,我们学习了文件流FileOutputStream和FileInputStream,以及缓存流BufferedOutputStream和BufferedInputStream。这些输入输出流都继承自InputStream和OutputStream,下面是它们的常用方法:InputStream的常用方法
available : 获取输入流的大小
read : 从输入流中读取数据
close : 关闭输入流
OutputStream的常用方法
write : 往输出流写数据
flush : 刷新输出流
close : 关闭输出流
java在进行http访问操作时,发送数据使用OutputStream,接收数据使用InputStream。如果采用HttpURLConnection,InputStream对象可从HttpURLConnection的getInputStream方法获得;如果采用HttpClient,InputStream对象可从HttpEntity的getContent方法获得。下面是http访问时与InputStream有关的加工操作:
1、从InputStream对象中读取字符串。首先把输入流的数据读到字节流ByteArrayOutputStream,然后调用字节流的toByteArray方法得到字节数组,最后调用String的构造函数根据指定编码从字节数组构造返回字符串;
2、从InputStream对象中读取图像。调用BitmapFactory的decodeStream方法即可返回Bitmap图像数据。
3、从InputStream对象中解压gzip压缩数据。引入GZIPInputStream从输入流构造解压流,然后再从解压流中读取数据。
HttpURLConnection
HttpURLConnection是java自带的http连接工具,属于轻量级,基本上使用该类就能打遍http,当然复杂点的功能(如分段传输、上传等等)得自己写代码细节。HttpURLConnection对象可从URL类的openConnection方法获得,下面是HttpURLConnection的常用方法:setRequestMethod : 设置请求类型。GET表示get请求,POST表示post请求。
setConnectTimeout : 设置连接的超时时间。
setReadTimeout : 设置读取的超时时间。
setRequestProperty : 设置请求包头的字段。
setDoOutput : 设置是否允许发送数据。如果用到getOutputStream方法,则setDoOutput必须设置为true。
setDoInput : 设置是否允许接收数据。如果用到getInputStream方法,则setDoInput必须设置为true。
getOutputStream : 获取http输出流。调用该函数返回一个OutputStream对象,接着依次调用该对象的write和flush方法写入要发送的数据。
connect : 建立http连接。该方法在getOutputStream之后调用,在getInputStream之前调用。
getInputStream : 获取http输入流。调用该函数返回一个InputStream对象,接着调用该对象的read方法读出接收到的数据。
getResponseCode : 获取http返回码。
getHeaderField : 获取应答数据包头的指定字段值。
getHeaderFields : 获取应答数据包头的所有字段列表。
disconnect : 断开http连接。
HttpClient
HttpClient是Apache的http访问工具,属于重量级,封装了一些常用的处理工具如get请求工具HttpGet、post请求工具HttpPost、http响应工具HttpResponse、url编码表单工具UrlEncodedFormEntity、分段传输工具MultipartEntity等等。早期的Android同时包括Commons HttpClient (org.apache.commons.httpclient.*) 和 HttpComponents (org.apache.http.client.*),后来就只内置后者了。即便是后者,Android也只内置了核心部分,开发中要想使用高级功能,还得引入httpmime和httpcore的jar包。
HttpGet和HttpPost分别用来处理get请求和post请求,两个类都继承自HttpRequestBase,而HttpRequestBase又继承自AbstractHttpMessage,下面是它们的常用方法:
构造函数 :
getMethod : 获取请求类型。
setHeader : 设置请求包头的字段值。无则添加,有则替换。
addHeader : 添加请求包头的字段值。不管原来有没有都予以添加,所以多次add会产生同名的重复字段。
setEntity : HttpPost专用,设置请求数据的包体。
设置超时时间要在HttpClient中直接设置,示例代码如下:
HttpClient httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
设置完毕HttpGet或者HttpPost,接着便是调用HttpClient的execute方法。该方法返回一个HttpResponse对象,下面是HttpResponse的常用方法:
getStatusLine : 获取http的处理结果。该方法返回一个StatusLine对象,要想获取状态码还得调用该对象的getStatusCode方法才行。
getHeaders : 获取应答的包头数据。
getEntity : 获取应答的包体数据。该方法返回一个HttpEntity对象,要想获取输入流还得调用该对象的getContent方法才行。
post方式发送的数据分两种,一种是表单数据,另一种是文件数据。表单数据的Content-Type为application/x-www-form-urlencoded,对应的处理类是UrlEncodedFormEntity;文件数据的Content-Type为multipart/form-data对应的处理类是MultipartEntityBuilder。这两个处理类都是从HttpEntity演化而来,其对象都作为setEntity方法的参数。
UrlEncodedFormEntity传入的是表单数据的键值对,构造函数的入参是键值对数组List<NameValuePair>,该数组的元素可添加BasicNameValuePair类型的对象。
MultipartEntityBuilder传入的是特殊的键值对,本质是按照分隔符分块传输,下面是它的常用方法:
create : 静态方法,创建一个MultipartEntityBuilder的实例。
setMode : 设置传输模式。一般是HttpMultipartMode.BROWSER_COMPATIBLE,这样可以更好的兼容不同浏览器。
setBoundary : 设置分隔符。
setCharset : 设置字符编码。
addPart : 添加一个分块。第一个参数是名称,第二个参数视情况如果是传输文本则为StringBody类型,如果是传输图片则为ByteArrayBody类型。
build : 建造并返回HttpEntity对象。
HTTP访问的额外处理
URL汉字编码
使用get方式传递请求数据,参数是放在url中直接送过去。如果参数值中有中文的,还得进行UTF8编码,比如“你”要转为“%E4%BD%A0”。下面是对url串进行转义与编码处理的代码示例:import java.util.Locale; import android.util.Log; public class URLtoUTF8 { private static final String TAG = "URLtoUTF8"; //转换为%E4%BD%A0形式 public static String toUtf8String(String s) { StringBuffer sb = new StringBuffer(); for (int i = 0;i < s.length();i++) { char c = s.charAt(i); if (c >= 0 && c <= 255) { sb.append(c); }else { byte[] b; try { b = String.valueOf(c).getBytes("utf-8"); }catch (Exception ex) { Log.d(TAG, ex.toString()); b = new byte[0]; } for (int j = 0;j < b.length;j++) { int k = b[j]; if (k < 0) k += 256; sb.append("%" + Integer.toHexString(k).toUpperCase(Locale.getDefault())); } } } return sb.toString(); } //将%E4%BD%A0转换为汉字 public static String unescape(String s) { StringBuffer sbuf = new StringBuffer(); int l = s.length(); int ch = -1; int b, sumb = 0; for (int i = 0, more = -1;i < l;i++) { /* Get next byte b from URL segment s */ switch (ch = s.charAt(i)) { case '%': ch = s.charAt(++i); int hb = (Character.isDigit((char) ch) ? ch - '0' : 10 + Character.toLowerCase((char) ch) - 'a') & 0xF; ch = s.charAt(++i); int lb = (Character.isDigit((char) ch) ? ch - '0' : 10 + Character.toLowerCase((char) ch) - 'a') & 0xF; b = (hb << 4) | lb; break; case '+': b = ' '; break; default: b = ch; } /* Decode byte b as UTF-8, sumb collects incomplete chars */ if ((b & 0xc0) == 0x80) {// 10xxxxxx (continuation byte) sumb = (sumb << 6) | (b & 0x3f);// Add 6 bits to sumb if (--more == 0) sbuf.append((char) sumb);// Add char to sbuf }else if ((b & 0x80) == 0x00) {// 0xxxxxxx (yields 7 bits) sbuf.append((char) b);// Store in sbuf }else if ((b & 0xe0) == 0xc0) {// 110xxxxx (yields 5 bits) sumb = b & 0x1f; more = 1;// Expect 1 more byte }else if ((b & 0xf0) == 0xe0) {// 1110xxxx (yields 4 bits) sumb = b & 0x0f; more = 2;// Expect 2 more bytes }else if ((b & 0xf8) == 0xf0) {// 11110xxx (yields 3 bits) sumb = b & 0x07; more = 3;// Expect 3 more bytes }else if ((b & 0xfc) == 0xf8) {// 111110xx (yields 2 bits) sumb = b & 0x03; more = 4;// Expect 4 more bytes }else /*if ((b & 0xfe) == 0xfc)*/{// 1111110x (yields 1 bit) sumb = b & 0x01; more = 5;// Expect 5 more bytes } /* We don't test if the UTF-8 encoding is well-formed */ } return sbuf.toString(); } }
数据解压缩
http请求的包头带有“Accept-Encoding: gzip,deflate”,则表示客户端支持gzip压缩;那么服务器可能就会返回gzip压缩的应答数据,此时应答包头中会有“Content-Encoding: gzip”。对压缩数据必须先解压后才可正常读取,不然未解压只会读到一堆乱码。输入流的gzip解压使用GZIPInputStream工具类,具体的代码例子如下:import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; import android.util.Log; public class StreamTool { private static final String TAG = "StreamTool"; public static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return data; } public static String getUnzipStream(InputStream is, String content_encoding, String charset) { String resp_content = ""; GZIPInputStream gzin = null; if (content_encoding != null && content_encoding.equals("") != true) { if (content_encoding.indexOf("gzip") >= 0) { try { Log.d(TAG, "content_encoding="+content_encoding); gzin = new GZIPInputStream(is); } catch (IOException e) { e.printStackTrace(); } } } try { if (gzin == null) { resp_content = new String(readInputStream(is), charset); } else { resp_content = new String(readInputStream(gzin), charset); } } catch (Exception e) { e.printStackTrace(); } return resp_content; } }
传递Cookie
携带用户信息访问服务器页面,需要保证会话的有效性,因此http请求的上下文得互相传递Cookie信息。请求数据的Cookie可在请求包头的Cookie字段中传输,应答数据返回的Cookie是在返回包头的Set-Cookie字段。不过应答报文中有时存在多个Set-Cookie字段,遇到这种情况就得分别取出其中Cookie并拼接起来。HttpURLConnection类获取多个同名包头字段使用getHeaderFields方法,举例如下:
Map<String, List<String>> headerFields = conn.getHeaderFields(); List<String> cookies = headerFields.get("Set-Cookie");HttpClient类获取多个同名包头字段使用getHeaders方法,举例如下:
Header[] cookie_headers = httpResponse.getHeaders("Set-Cookie");
代码示例
下面是HttpURLConnection方式的示例代码:import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.util.Iterator; import java.util.List; import java.util.Map; import com.example.exmhttp.util.HttpReqData; import com.example.exmhttp.util.HttpRespData; import com.example.exmhttp.util.StreamTool; import android.graphics.BitmapFactory; import android.util.Log; public class HttpUrlUtil { private static final String TAG = "HttpUrlUtil"; //设置http连接的头部信息 private static void setConnHeader(HttpURLConnection conn, String method, HttpReqData req_data) throws ProtocolException { conn.setRequestMethod(method); conn.setConnectTimeout(5000); conn.setReadTimeout(10000); conn.setRequestProperty("Accept", "*/*"); //IE使用 // conn.setRequestProperty("Accept-Language", "zh-CN"); // conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C)"); //firefox使用 conn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"); conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); if (req_data.content_type.equals("") != true) { conn.setRequestProperty("Content-Type", req_data.content_type); } if (req_data.x_requested_with.equals("") != true) { conn.setRequestProperty("X-Requested-With", req_data.x_requested_with); } if (req_data.referer.equals("") != true) { conn.setRequestProperty("Referer", req_data.referer); } if (req_data.cookie.equals("") != true) { conn.setRequestProperty("Cookie", req_data.cookie); Log.d(TAG, "setConnHeader cookie="+req_data.cookie); } } private static String getRespCookie(HttpURLConnection conn, HttpReqData req_data) { String cookie = ""; Map<String, List<String>> headerFields = conn.getHeaderFields(); if (headerFields != null) { List<String> cookies = headerFields.get("Set-Cookie"); if (cookies != null) { for (String cookie_item : cookies) { cookie = cookie + cookie_item + "; "; } } else { cookie = req_data.cookie; } } else { cookie = req_data.cookie; } Log.d(TAG, "cookie="+cookie); return cookie; } //get文本数据 public static HttpRespData getData(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); try { URL url = new URL(req_data.url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); setConnHeader(conn, "GET", req_data); conn.connect(); resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(), conn.getHeaderField("Content-Encoding"), req_data.charset); resp_data.cookie = conn.getHeaderField("Set-Cookie"); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //get图片数据 public static HttpRespData getImage(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); try { URL url = new URL(req_data.url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); setConnHeader(conn, "GET", req_data); conn.connect(); InputStream is = conn.getInputStream(); resp_data.bitmap = BitmapFactory.decodeStream(is); resp_data.cookie = conn.getHeaderField("Set-Cookie"); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容放在url中 public static HttpRespData postUrl(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); String s_url = req_data.url; if (req_data.params != null) { s_url += "?" + req_data.params.toString(); } Log.d(TAG, "s_url="+s_url); try { URL url = new URL(s_url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); setConnHeader(conn, "POST", req_data); conn.setDoOutput(true); conn.connect(); resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(), conn.getHeaderField("Content-Encoding"), req_data.charset); resp_data.cookie = conn.getHeaderField("Set-Cookie"); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容放在输出流中 public static HttpRespData postData(HttpReqData req_data) { req_data.content_type = "application/x-www-form-urlencoded"; HttpRespData resp_data = new HttpRespData(); String s_url = req_data.url; Log.d(TAG, "s_url="+s_url+", params="+req_data.params.toString()); try { URL url = new URL(s_url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); setConnHeader(conn, "POST", req_data); conn.setDoOutput(true); conn.setDoInput(true); conn.connect(); PrintWriter out = new PrintWriter(conn.getOutputStream()); out.print(req_data.params.toString()); out.flush(); resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(), conn.getHeaderField("Content-Encoding"), req_data.charset); resp_data.cookie = getRespCookie(conn, req_data); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容分段传输 public static HttpRespData postMultiData(HttpReqData req_data, Map<String, String> map) { HttpRespData resp_data = new HttpRespData(); String s_url = req_data.url; Log.d(TAG, "s_url="+s_url); String end = "\r\n"; String hyphens = "--"; try { URL url = new URL(s_url); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); setConnHeader(conn, "POST", req_data); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+req_data.boundary); conn.setRequestProperty("Cache-Control", "no-cache"); conn.setDoOutput(true); conn.setDoInput(true); StringBuffer buffer = new StringBuffer(); Log.d(TAG, "map.size()=" + map.size()); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String str = it.next(); buffer.append(hyphens + req_data.boundary + end); buffer.append("Content-Disposition: form-data; name=\""); buffer.append(str); buffer.append("\"" + end + end); buffer.append(map.get(str)); buffer.append(end); Log.d(TAG, "key=" + str + ", value=" + map.get(str)); } if (map.size() > 0) { buffer.append(hyphens + req_data.boundary + end); byte[] param_data = buffer.toString().getBytes(req_data.charset); OutputStream out = conn.getOutputStream(); out.write(param_data); out.flush(); } conn.connect(); resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(), conn.getHeaderField("Content-Encoding"), req_data.charset); resp_data.cookie = conn.getHeaderField("Set-Cookie"); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } }
下面是HttpClient方式的示例代码:
import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.CoreConnectionPNames; import android.graphics.BitmapFactory; import android.util.Log; import com.example.exmhttp.util.HttpReqData; import com.example.exmhttp.util.HttpRespData; import com.example.exmhttp.util.StreamTool; public class HttpClientUtil { private static final String TAG = "HttpClientUtil"; private static void setConnHeader(HttpRequestBase conn, HttpReqData req_data) { conn.setHeader("Accept", "*/*"); //IE使用 // conn.setHeader("Accept-Language", "zh-CN"); // conn.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C)"); //firefox使用 conn.setHeader("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); conn.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"); conn.setHeader("Accept-Encoding", "gzip, deflate"); if (req_data.content_type.equals("") != true) { conn.setHeader("Content-Type", req_data.content_type); } if (req_data.x_requested_with.equals("") != true) { conn.setHeader("X-Requested-With", req_data.x_requested_with); } if (req_data.referer.equals("") != true) { conn.setHeader("Referer", req_data.referer); } if (req_data.cookie.equals("") != true) { conn.setHeader("Cookie", req_data.cookie); Log.d(TAG, "setConnHeader cookie="+req_data.cookie); } } private static HttpClient getHttpClient() { HttpClient httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); return httpClient; } private static String getRespContent(HttpEntity httpEntity, HttpResponse httpResponse, String charset) throws Exception { String content_encoding = ""; Header[] encoding_headers = httpResponse.getHeaders("Content-Encoding"); if (encoding_headers!=null && encoding_headers.length>0) { content_encoding = encoding_headers[0].getValue(); } String content = ""; content = StreamTool.getUnzipStream(httpEntity.getContent(), content_encoding, charset); return content; } private static String getRespCookie(HttpResponse httpResponse, HttpReqData req_data) { String cookie = ""; Header[] cookie_headers = httpResponse.getHeaders("Set-Cookie"); if (cookie_headers != null) { if (cookie_headers.length == 1) { cookie = cookie_headers[0].getValue(); } else { for (int i=0; i<cookie_headers.length; i++) { Header cookie_header = cookie_headers[i]; cookie = cookie + cookie_header.getValue() + "; "; } } } else { cookie = req_data.cookie; } Log.d(TAG, "cookie="+cookie); return cookie; } //get文本数据 public static HttpRespData getData(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); HttpGet httpGet = new HttpGet(req_data.url); setConnHeader(httpGet, req_data); HttpClient httpClient = getHttpClient(); try { HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); resp_data.content = getRespContent(httpEntity, httpResponse, req_data.charset); resp_data.cookie = getRespCookie(httpResponse, req_data); Log.d(TAG, "返回内容:"+resp_data.content); }catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //get图片数据 public static HttpRespData getImage(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); HttpGet httpGet = new HttpGet(req_data.url); setConnHeader(httpGet, req_data); HttpClient httpClient = getHttpClient(); try { HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); InputStream is = httpEntity.getContent(); resp_data.bitmap = BitmapFactory.decodeStream(is); if (req_data.cookie.equals("") == true) { resp_data.cookie = getRespCookie(httpResponse, req_data); } }catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容放在url中 public static HttpRespData postUrl(HttpReqData req_data) { String s_url = req_data.url; if (req_data.params != null) { s_url += "?" + req_data.params.toString(); } Log.d(TAG, "s_url="+s_url); HttpRespData resp_data = new HttpRespData(); HttpPost httpPost = new HttpPost(s_url); setConnHeader(httpPost, req_data); HttpClient httpClient = getHttpClient(); try { HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); resp_data.content = getRespContent(httpEntity, httpResponse, req_data.charset); resp_data.cookie = getRespCookie(httpResponse, req_data); Log.d(TAG, "返回内容:"+resp_data.content); }catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容放在输出流中 public static HttpRespData postData(HttpReqData req_data) { HttpRespData resp_data = new HttpRespData(); HttpPost httpPost = new HttpPost(req_data.url); setConnHeader(httpPost, req_data); HttpClient httpClient = getHttpClient(); try { //设置参数 List<NameValuePair> list = new ArrayList<NameValuePair>(); if (req_data.params != null) { String[] items = req_data.params.toString().split("&"); for (int i=0; i<items.length; i++) { String item = items[i]; String[] pair = item.split("="); if (pair.length >= 2) { list.add(new BasicNameValuePair(pair[0], pair[1])); } } } if(list.size() > 0){ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, req_data.charset); httpPost.setEntity(entity); } HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); resp_data.content = getRespContent(httpEntity, httpResponse, req_data.charset); resp_data.cookie = getRespCookie(httpResponse, req_data); resp_data.cookie = req_data.cookie + resp_data.cookie; Log.d(TAG, "返回内容:"+resp_data.content); }catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } //post的内容分段传输 public static HttpRespData postMultiData(HttpReqData req_data, Map<String, String> map) { HttpRespData resp_data = new HttpRespData(); HttpPost httpPost = new HttpPost(req_data.url); setConnHeader(httpPost, req_data); HttpClient httpClient = getHttpClient(); try { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setBoundary(req_data.boundary); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); Log.d(TAG, "map.size()=" + map.size()); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String str = it.next(); builder.addPart(str, new StringBody(map.get(str), ContentType.DEFAULT_TEXT)); } //如果传递图片,则要转为字节流传输 // try { // ByteArrayOutputStream bos = new ByteArrayOutputStream(); // bitmap.compress(CompressFormat.JPEG, 75, bos); // byte[] data = bos.toByteArray(); // ByteArrayBody bab = new ByteArrayBody(data, "this.jpg"); // builder.addPart("image", bab); // } catch(Exception e){ // builder.addPart("image", new StringBody("image error")); // } httpPost.setEntity(builder.build()); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); resp_data.content = getRespContent(httpEntity, httpResponse, req_data.charset); resp_data.cookie = getRespCookie(httpResponse, req_data); Log.d(TAG, "返回内容:"+resp_data.content); }catch (Exception e) { e.printStackTrace(); resp_data.err_msg = e.getMessage(); } return resp_data; } }
点此查看Android开发笔记的完整目录
相关文章推荐
- GNS3-1.4导入虚拟机做实验操作
- The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
- https://projecteuler.net/problem=1
- C#高性能TCP服务的多种实现方式
- hrbust 哈理工oj 2038 联系网络【MST】【最小生成树】
- Quick-cocos2d-x v3.3 SocketTCP链接
- TCP/IP学习与总结-3(TCP/IP 协议)
- 详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
- 一张图搞定TCP/UDP
- iOS网络状态模拟——Network Link Conditioner
- exchange IE登录提示http 500 内部服务器错误
- TCP协议的三次握手
- iOS开发之网络编程--中文转码
- VMware网络连接三种模式bridged、host-only、NAT
- OKHttp使用简介
- HTTP与HTTPS的区别
- iOS开发使用GDataXML框架解析网络数据
- jQuery全屏滚动插件fullPage(转自https://github.com/powy1993/fullpage)
- scapy-掌控网络-窃取email认证
- scapy-网络掌控者-基本