一、httpclient是什么
HttpClient是一个开源的Java库,它支持HTTP协议。它总共只分为四个模块:HttpClient是模块的核心,用于提供httpclient的api, HttpCore提供基本的网络操作,至于协议相关的内容可以去Apache的官网查阅,HttpAsyncClient是异步的httpclient,HttpMime用于处理网络数据的mime类型。
二、使用httpclient下载文件的步骤
使用httpclient下载文件要经过以下几个步骤:
- 创建HttpClient对象
- 创建HttpGet或HttpPost请求对象
- 执行请求,获得响应结果
- 如果响应的状态码是200,说明响应成功,获取响应的输入流并读取数据
- 关闭输入流和HttpClient对象。
三、httpclient下载文件的示例代码
import java.io.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class HttpDownload{
public static void main(String[] args) throws Exception{
String url = "http://www.example.com/file/example.jpg";
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
InputStream is = response.getEntity().getContent();
File file = new File("example.jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){
fos.write(buffer, 0, len);
}
fos.close();
is.close();
}
httpclient.getConnectionManager().shutdown();
}
}
四、设置httpclient的请求头
在http请求中,请求头的内容是非常重要的。对于一些网站,它们可以根据请求头来判断请求的来源,并进行相应的处理。在使用httpclient进行文件下载时,也可以设置请求头,以达到隐藏下载行为的目的。 为了设置请求头,我们可以使用httpget.setHeader方法。下面是示例代码:
import java.io.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class HttpDownload{
public static void main(String[] args) throws Exception{
String url = "http://www.example.com/file/example.jpg";
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
httpget.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
HttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
InputStream is = response.getEntity().getContent();
File file = new File("example.jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){
fos.write(buffer, 0, len);
}
fos.close();
is.close();
}
httpclient.getConnectionManager().shutdown();
}
}
五、设置httpclient的请求参数
如果您需要带上一些请求参数,以便进行授权或其它的认证,就可以使用httpclient的HttpParams类。HttpParams类是一个接口,它的实现类是BasicHttpParams。 这里的请求参数包括Timeout、socketBufferSize、http.socket.timeout、http.connection.timeout、http.connection-manager.timeout。下面是示例代码:
import java.io.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.BasicHttpParams;
public class HttpDownload{
public static void main(String[] args) throws Exception{
String url = "http://www.example.com/file/example.jpg";
HttpParams params = new BasicHttpParams();
params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);
params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 1000);
params.setParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 1024);
params.setParameter("http.socket.timeout", new Integer(1000));
params.setParameter("http.connection.timeout", new Integer(1000));
params.setParameter("http.connection-manager.timeout", new Long(1000));
HttpClient httpclient = new DefaultHttpClient(new PoolingClientConnectionManager(), params);
HttpGet httpget = new HttpGet(url);
httpget.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
HttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
InputStream is = response.getEntity().getContent();
File file = new File("example.jpg");
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){
fos.write(buffer, 0, len);
}
fos.close();
is.close();
}
httpclient.getConnectionManager().shutdown();
}
}