HttpClient接口
实现类:DefaultHttpClient这也是常用的一个用于实现HttpClient接口的子类,
HttpClietnt中定义的常用抽象方法
方法名称 |
描述 |
public abstract HttpResponse execute (HttpUriRequest request) |
通过HttpUriRequest对象执行返回一个HttpResponse对象 |
public abstract HttpResponse execute (HttpUriRequest request, HttpContext context) |
通过HttpUriRequest对象和HttpContext对象执行返回一个HttpResponse对象 |
HttpResponse接口
HttpResponse接口里定义了一系列的set、get方法
方法名称 |
描述 |
public abstract HttpEntity getEntity () |
得到一个HttpEntity对象 |
public abstract StatusLine getStatusLine () |
得到一个StatusLine(也就是HTTP协议中的状态行我们知道HTPP状态行由三部分组成:HTTP协议版本,服务器发回的响应状态代码,状态码的文本描述)接口的实例对象 |
public abstract Locale getLocale () |
得到Locale对象 |
….相应的set方法 |
|
StatusLine接口
StatusLine接口的常用方法。也可以通过其实现的子类BasicStatusLine类里查看
方法名称 |
描述 |
public abstract ProtocolVersion getProtocolVersion () |
得到一个ProtolVersion对象它是一个HTTP版本的封装类,在这个类里定义了一系列的方法我们可以通过它的getProtocol方法取得协议名称,getMinor得到HTPP协议的版本 |
public abstract String getReasonPhrase () |
状态码的文本描述 |
public abstract int getStatusCode () |
得到响应状态码 |
HttpEntity接口
HttpEntity是一个接口
方法名称 |
描述 |
public abstract InputStream getContent () |
得到一个输入流对象,我们可以用这个流来操作文件(例如保存文件到SD卡) |
public abstract Header getContentType () |
得到Content-Type信息头 |
public abstract Header getContentEncoding () |
得到Content-Encoding信息头 |
我们可以通过EntityUtils类,它是一个final类,一个专门针对于处理HttpEntity的帮助类
常用方法
EntityUtils类
EntityUtils类的常用方法
方法名称 |
描述 |
public static String getContentCharSet (HttpEntity entity) |
设置HttpEntity对象的ContentCharset |
public static byte[] toByteArray (HttpEntity entity) |
将HttpClient转换成一个字节数组 |
public static String toString (HttpEntity entity, String defaultCharset) |
通过指定的编码方式取得HttpEntity里字符串内容 |
public static String toString (HttpEntity entity) |
取得HttpEntity里字符串内容 |
NameValuePair
NameValuePair接口是一个简单的封闭的键值对,只提供了一个getName()和一个getValue方法。主要用到的实现类BasicNameVaulePair
HttpGet类
HttpGet它实现了HttpRequest、HttpUriRequest接口
构造方法
方法名称 |
描述 |
public HttpGet () |
无参数构造方法用以实例化对象 |
public HttpGet (URI uri) |
通过URI对象构造HttpGet对象 |
public HttpGet (String uri) |
通过指定的uri字符串地址构造实例化HttpGet对象 |
HttpPost类
同样它也实现了HttpRequest、HttpUriRequest接口等一系列接口
构造方法
方法名称 |
描述 |
public HttpPost () |
无参数构造方法用以实例化对象 |
public HttpPost (URI uri) |
通过URI对象构造HttpPost对象 |
public HttpPost (String uri) |
通过指定的uri字符串地址构造实例化HttpPost对象 |
HttpClient 4:
连接超时:
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,60000);
// 或者
HttpConnectionParams.setConnectionTimeout(params,6000);
|
读取超时:
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
// 或者
HttpConnectionParams.setSoTimeout(params,60000);
|
HttpClient 3:
连接超时:
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(60000);
|
读取超时:
httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000);
|
清楚了上面的所有常用API后,下面我们能过Apache HTTP来访问HTTP资源:
1. 创建HttpGet或者HttpPost对象,将要请求的URL对象构造方法传入HttpGet、HttpPost对象
2. 通过HttpClent接口的实现类DefaultClent.的excute(HttpUriRequest request)而我们已经知道HttpGet和HttpPost类都实现了HttpUriRequest接口,所以这里面,我们可以将第1步创建好的HttpGet或者HttpPost对象传入进来。来得到HttpResponse对象
3. 通过HttpResponse取到返回的一些信息,再做提取。
public static void main(String[] args) throws HttpException, IOException { HttpClient httpClient = new HttpClient(); httpClient.getHostConfiguration().setProxy("localhost", 808); /*//需要验证 UsernamePasswordCredentials creds = new UsernamePasswordCredentials("chenlb", "123456"); httpClient.getState().setProxyCredentials(AuthScope.ANY, creds); */ //设置http头 List<Header> headers = new ArrayList<Header>(); headers.add(new Header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)")); httpClient.getHostConfiguration().getParams().setParameter("http.default-headers", headers); GetMethod method = new GetMethod("http://www.baidu.com"); method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false)); try { int statusCode = httpClient.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { System.out.println("Method failed code="+statusCode+": " + method.getStatusLine()); } else { System.out.println(new String(method.getResponseBody(), "gb2312")); } } finally { method.releaseConnection(); } } }
如果要用户名与密码验证的,请把上面的 /* */注释去掉。使验证有效。
用户名密码 验证,关键是:
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("chenlb", "123456"); httpClient.getState().setProxyCredentials(AuthScope.ANY, creds);
参考:
http://blog.chenlb.com/2008/11/set-httpclient-proxy-and-http-request-header.html