引用
http://blog.csdn.net/nupt123456789/article/details/42721003
1.HttpClient
大家可以先看一下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/19624529
当然,详细的文档,你可以去官方网站查看和下载:http://hc.apache.org/httpclient-3.x/
2.本博客简单介绍一下POST和GET以及文件下载的应用。
1.HttpClient 大家可以先看一下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/19624529 当然,详细的文档,你可以去官方网站查看和下载:http://hc.apache.org/httpclient-3.x/ 2.本博客简单介绍一下POST和GET以及文件下载的应用。 代码如下: package net.mobctrl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; /** * @web http://www.mobctrl.net * @author Zheng Haibo * @Description: 文件下载 POST GET */ public class HttpClientUtils { /** * 最大线程池 */ public static final int THREAD_POOL_SIZE = 5; public interface HttpClientDownLoadProgress { public void onProgress(int progress); } private static HttpClientUtils httpClientDownload; private ExecutorService downloadExcutorService; private HttpClientUtils() { downloadExcutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE); } public static HttpClientUtils getInstance() { if (httpClientDownload == null) { httpClientDownload = new HttpClientUtils(); } return httpClientDownload; } /** * 下载文件 * * @param url * @param filePath */ public void download(final String url, final String filePath) { downloadExcutorService.execute(new Runnable() { @Override public void run() { httpDownloadFile(url, filePath, null, null); } }); } /** * 下载文件 * * @param url * @param filePath * @param progress * 进度回调 */ public void download(final String url, final String filePath, final HttpClientDownLoadProgress progress) { downloadExcutorService.execute(new Runnable() { @Override public void run() { httpDownloadFile(url, filePath, progress, null); } }); } /** * 下载文件 * * @param url * @param filePath */ private void httpDownloadFile(String url, String filePath, HttpClientDownLoadProgress progress, Map<String, String> headMap) { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpGet httpGet = new HttpGet(url); setGetHead(httpGet, headMap); CloseableHttpResponse response1 = httpclient.execute(httpGet); try { System.out.println(response1.getStatusLine()); HttpEntity httpEntity = response1.getEntity(); long contentLength = httpEntity.getContentLength(); InputStream is = httpEntity.getContent(); // 根据InputStream 下载文件 ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int r = 0; long totalRead = 0; while ((r = is.read(buffer)) > 0) { output.write(buffer, 0, r); totalRead += r; if (progress != null) {// 回调进度 progress.onProgress((int) (totalRead * 100 / contentLength)); } } FileOutputStream fos = new FileOutputStream(filePath); output.writeTo(fos); output.flush(); output.close(); fos.close(); EntityUtils.consume(httpEntity); } finally { response1.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * get请求 * * @param url * @return */ public String httpGet(String url) { return httpGet(url, null); } /** * http get请求 * * @param url * @return */ public String httpGet(String url, Map<String, String> headMap) { String responseContent = null; CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response1 = httpclient.execute(httpGet); setGetHead(httpGet, headMap); try { System.out.println(response1.getStatusLine()); HttpEntity entity = response1.getEntity(); responseContent = getRespString(entity); System.out.println("debug:" + responseContent); EntityUtils.consume(entity); } finally { response1.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return responseContent; } public String httpPost(String url, Map<String, String> paramsMap) { return httpPost(url, paramsMap, null); } /** * http的post请求 * * @param url * @param paramsMap * @return */ public String httpPost(String url, Map<String, String> paramsMap, Map<String, String> headMap) { String responseContent = null; CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httpPost = new HttpPost(url); setPostHead(httpPost, headMap); setPostParams(httpPost, paramsMap); CloseableHttpResponse response = httpclient.execute(httpPost); try { System.out.println(response.getStatusLine()); HttpEntity entity = response.getEntity(); responseContent = getRespString(entity); EntityUtils.consume(entity); } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("responseContent = " + responseContent); return responseContent; } /** * 设置POST的参数 * * @param httpPost * @param paramsMap * @throws Exception */ private void setPostParams(HttpPost httpPost, Map<String, String> paramsMap) throws Exception { if (paramsMap != null && paramsMap.size() > 0) { List<NameValuePair> nvps = new ArrayList<NameValuePair>(); Set<String> keySet = paramsMap.keySet(); for (String key : keySet) { nvps.add(new BasicNameValuePair(key, paramsMap.get(key))); } httpPost.setEntity(new UrlEncodedFormEntity(nvps)); } } /** * 设置http的HEAD * * @param httpPost * @param headMap */ private void setPostHead(HttpPost httpPost, Map<String, String> headMap) { if (headMap != null && headMap.size() > 0) { Set<String> keySet = headMap.keySet(); for (String key : keySet) { httpPost.addHeader(key, headMap.get(key)); } } } /** * 设置http的HEAD * * @param httpGet * @param headMap */ private void setGetHead(HttpGet httpGet, Map<String, String> headMap) { if (headMap != null && headMap.size() > 0) { Set<String> keySet = headMap.keySet(); for (String key : keySet) { httpGet.addHeader(key, headMap.get(key)); } } } /** * 上传文件 * * @param serverUrl * 服务器地址 * @param localFilePath * 本地文件路径 * @param serverFieldName * @param params * @return * @throws Exception */ public String uploadFileImpl(String serverUrl, String localFilePath, String serverFieldName, Map<String, String> params) throws Exception { String respStr = null; CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost(serverUrl); FileBody binFileBody = new FileBody(new File(localFilePath)); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder .create(); // add the file params multipartEntityBuilder.addPart(serverFieldName, binFileBody); // 设置上传的其他参数 setUploadParams(multipartEntityBuilder, params); HttpEntity reqEntity = multipartEntityBuilder.build(); httppost.setEntity(reqEntity); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); respStr = getRespString(resEntity); EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpclient.close(); } System.out.println("resp=" + respStr); return respStr; } /** * 设置上传文件时所附带的其他参数 * * @param multipartEntityBuilder * @param params */ private void setUploadParams(MultipartEntityBuilder multipartEntityBuilder, Map<String, String> params) { if (params != null && params.size() > 0) { Set<String> keys = params.keySet(); for (String key : keys) { multipartEntityBuilder .addPart(key, new StringBody(params.get(key), ContentType.TEXT_PLAIN)); } } } /** * 将返回结果转化为String * * @param entity * @return * @throws Exception */ private String getRespString(HttpEntity entity) throws Exception { if (entity == null) { return null; } InputStream is = entity.getContent(); StringBuffer strBuf = new StringBuffer(); byte[] buffer = new byte[4096]; int r = 0; while ((r = is.read(buffer)) > 0) { strBuf.append(new String(buffer, 0, r, "UTF-8")); } return strBuf.toString(); } } 我们可以使用如下代码进行测试: import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import net.mobctrl.HttpClientUtils; import net.mobctrl.HttpClientUtils.HttpClientDownLoadProgress; /** * @date 2015年1月14日 下午1:49:50 * @author Zheng Haibo * @Description: 测试 */ public class Main { public static void main(String[] args) { /** * 测试下载文件 异步下载 */ HttpClientUtils.getInstance().download( "http://newbbs.qiniudn.com/phone.png", "test.png", new HttpClientDownLoadProgress() { @Override public void onProgress(int progress) { System.out.println("download progress = " + progress); } }); // POST 同步方法 Map<String, String> params = new HashMap<String, String>(); params.put("username", "admin"); params.put("password", "admin"); HttpClientUtils.getInstance().httpPost( "http://192.168.31.183:8080/SSHMySql/register", params); // GET 同步方法 HttpClientUtils.getInstance().httpGet( "http://wthrcdn.etouch.cn/weather_mini?city=北京"); // 上传文件 POST 同步方法 try { Map<String,String> uploadParams = new LinkedHashMap<String, String>(); uploadParams.put("userImageContentType", "image"); uploadParams.put("userImageFileName", "testaa.png"); HttpClientUtils.getInstance().uploadFileImpl( "http://192.168.31.183:8080/SSHMySql/upload", "android_bug_1.png", "userImage", uploadParams); } catch (Exception e) { e.printStackTrace(); } } } 运行结果为: HTTP/1.1 200 OK responseContent = {"id":"-2","msg":"添加失败!用户名已经存在!"} HTTP/1.1 200 OK download progress = 6 download progress = 11 download progress = 13 download progress = 20 download progress = 22 download progress = 26 download progress = 31 download progress = 33 download progress = 35 download progress = 38 download progress = 40 download progress = 42 download progress = 44 download progress = 49 download progress = 53 download progress = 55 download progress = 57 download progress = 60 download progress = 62 download progress = 64 download progress = 66 download progress = 71 download progress = 77 download progress = 77 download progress = 80 download progress = 82 HTTP/1.1 200 OK debug:{"desc":"OK","status":1000,"data":{"wendu":"3","ganmao":"昼夜温差很大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。","forecast":[{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 6℃","type":"晴","low":"低温 -6℃","date":"22日星期四"},{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 6℃","type":"多云","low":"低温 -3℃","date":"23日星期五"},{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 5℃","type":"多云","low":"低温 -3℃","date":"24日星期六"},{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 5℃","type":"阴","low":"低温 -2℃","date":"25日星期天"},{"fengxiang":"无持续风向","fengli":"微风级","high":"高温 4℃","type":"多云","low":"低温 -2℃","date":"26日星期一"}],"yesterday":{"fl":"3-4级","fx":"北风","high":"高温 5℃","type":"晴","low":"低温 -6℃","date":"21日星期三"},"aqi":"124","city":"北京"}} download progress = 84 download progress = 86 download progress = 88 download progress = 91 download progress = 93 download progress = 95 download progress = 99 download progress = 100 HTTP/1.1 200 OK resp={"error_code":2000,"msg":"OK","filepath":"uploadfiles/192.168.31.72_android_bug_1.png"}