Java:使用HttpClient进行POST和GET请求以及文件下载
来源:程序员人生 发布时间:2015-03-06 08:43:48 阅读次数:2689次
1.HttpClient
大家可以先看1下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/19624529
固然,详细的文档,你可以去官方网站查看和下载:http://hc.apache.org/httpclient⑶.x/
2.本博客简单介绍1下POST和GET和文件下载的利用。
代码以下:
package net.mobctrl;
import java.io.ByteArrayOutputStream;
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.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();
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⑻"));
}
responseContent = strBuf.toString();
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();
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⑻"));
}
responseContent = strBuf.toString();
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));
}
}
}
}
我们可使用以下代码进行测试:
import java.util.HashMap;
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://localhost:8080/sshmysql/register", params);
// GET 同步方法
HttpClientUtils.getInstance().httpGet(
"http://wthrcdn.etouch.cn/weather_mini?city=北京");
}
}
运行结果为:
HTTP/1.1 200 OK
responseContent = {"id":"⑵","msg":"添加失败!用户名已存在!"}
HTTP/1.1 200 OK
debug:{"desc":"OK","status":1000,"data":{"wendu":"⑴","ganmao":"天气转凉,空气湿度较大,较易产生感冒,体质较弱的朋友请注意适当防护。","forecast":[{"fengxiang":"无延续风向","fengli":"微风级","high":"高温 2℃","type":"小雪","low":"低温 ⑸℃","date":"14日星期3"},{"fengxiang":"无延续风向","fengli":"微风级","high":"高温 3℃","type":"霾","low":"低温 ⑶℃","date":"15日星期4"},{"fengxiang":"北风","fengli":"4⑸级","high":"高温 5℃","type":"晴","low":"低温 ⑹℃","date":"16日星期5"},{"fengxiang":"无延续风向","fengli":"微风级","high":"高温 4℃","type":"多云","low":"低温 ⑸℃","date":"17日星期6"},{"fengxiang":"无延续风向","fengli":"微风级","high":"高温 6℃","type":"多云","low":"低温 ⑷℃","date":"18日星期天"}],"yesterday":{"fl":"微风","fx":"无延续风向","high":"高温 4℃","type":"霾","low":"低温 ⑷℃","date":"13日星期2"},"aqi":"309","city":"北京"}}
HTTP/1.1 200 OK
download progress = 2
download progress = 6
download progress = 8
download progress = 10
download progress = 12
download progress = 15
download progress = 17
download progress = 20
download progress = 22
download progress = 27
download progress = 29
download progress = 31
download progress = 33
download progress = 36
download progress = 38
download progress = 40
download progress = 45
download progress = 47
download progress = 49
download progress = 51
download progress = 54
download progress = 56
download progress = 58
download progress = 60
download progress = 62
download progress = 69
download progress = 75
download progress = 81
download progress = 87
download progress = 89
download progress = 91
download progress = 93
download progress = 96
download progress = 100
下载进程有进度回调。
相干的libs包,可以在以下链接中下载:http://download.csdn.net/detail/nuptboyzhb/8362801
上述代码,既可以在J2SE,J2EE中使用,也能够在Android中使用,在android中使用时,需要相干的权限。
未经允许不得用于商业目的
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠