使用httpclient发送get请求

来源:互联网 发布:淘宝怎么注册企业账号 编辑:程序博客网 时间:2024/05/21 22:31

一,简介

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

二,功能介绍

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等

三,使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接


四,实例


1,使用到的JAR包
package com.util;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import org.apache.http.HttpEntity;
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.util.EntityUtils;

2,创建类和方法
public class ClientGetTest()
{
public static void main(String[] args) throws Exception {
String lan=DoubleEncoding("zh");
String tok=DoubleEncoding("你好");
String ctp=DoubleEncoding("1");
String cuid=DoubleEncoding("sdfisf12213sdfww3");
String uri="http://www.baidu.com/text?lan="+lan+"&tok="+tok+"&ctp="+ctp+"&cuid="+cuid;
doGet(uri);
}
public static String DoubleEncoding(String param){
String str="";
try{
//对参数进行2次编码
str=URLEncoder.encode(URLEncoder.encode(param, "utf-8"), "utf-8");
}catch(Exception e){
e.printStackTrace();
}
return str;
}

public static OutputStream doGet(String url) {
//创建httpclient 实例
HttpClient httpclient = new DefaultHttpClient(); //第一种方法,过时
//第二种方法
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
CloseableHttpClient httpclient = httpClientBuilder.build();
OutputStream os = null;
try {
//创建
httpget HttpGet httpget = new HttpGet(url);
// 发送请求 HttpResponse
response = httpclient.execute(httpget);
//获取服务器响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
//将响应内容转化为流
InputStream instream = entity.getContent();
//读取流
int chByte = instream.read();
//创建文件输出流,用来存放响应内容
FileOutputStream fos = new FileOutputStream("d:test.txt");
//创建缓存输出流
BufferedOutputStream bos = new BufferedOutputStream(fos);
//循环,将响应内容写进test.txt文件中
while(chByte != -1) {
bos.write(chByte);
chByte = instream.read();
}

//关闭各种流
bos.flush();
bos.close();
fos.close();
instream.close();
return os;
}
} catch (Exception e) {
} finally {
//当HttpClient的实例不再需要时,可以使用连接管理器关闭
httpclient.getConnectionManager().shutdown();
}
return null;

}
}

五,方法和问题描述

1,url参数为什么要进行俩次encode

假如在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,在servlet中调用request.getParameter();方法时,服务器会使用指定的编码格式自动解码一次。

如果只用一次encode,假如服务器指定的编码格式不是UTF-8模式默认为ISO-8859-1,那么后台则会乱码

如果用两次encode

第一次编码后将汉字编码为%和字母数字的格式,而第二次编码的时候是对%字母数字进行编码,虽然解码的时候使用的是ISO-8859-1或其他编码,但是对于%和字母数字而言用ISO-8859-1和UTF-8解码出来的是一样的,此时就回到了汉字被编码过一次的字符串了,当再次进行解码的时候使用UTF-8就回将它转会汉字。

2、HttpClientBuilder

HttpClientBuilder用于创建CloseableHttpClient实例。看了一下API文档,AbstractHttpClient、 AutoRetryHttpClient、 DefaultHttpClient等都被弃用了,使用HttpClientBuilder代替。

3、CloseableHttpClient

实现接口:CloseableAutoCloseableHttpClient;子类:AbstractHttpClient

4、HttpGet

非线程安全;HttpGet有三个构造方法:HttpGet()、HttpGet(String uri)、HttpGet(URI uri)

5、HttpResponse

服务器在接收和解释请求之后返回一个HTTP响应信息

     Response      = Status-Line                     *(( general-header                      | response-header                      | entity-header ) CRLF)                     CRLF                     [ message-body ]
6、HttpEntity
  1. HttpEntity entity = new StringEntity("这一个字符串实体", "UTF-8");  
  2.             //内容类型  
  3.             System.out.println(entity.getContentType());  
  4.             //内容的编码格式  
  5.             System.out.println(entity.getContentEncoding());  
  6.             //内容的长度  
  7.             System.out.println(entity.getContentLength());  
  8.             //把内容转成字符串  
  9.             System.out.println(EntityUtils.toString(entity));  
  10.             //内容转成字节数组  
  11.             System.out.println(EntityUtils.toByteArray(entity).length);  
  12.             //还有个直接获得流  
  13.             //entity.getContent();  


1 0