您的位置:首页 > 理论基础 > 计算机网络

使用httpclient发送get请求

2016-07-27 17:10 741 查看

一,简介

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


HttpEntity entity = new StringEntity("这一个字符串实体", "UTF-8");  

            //内容类型  

            System.out.println(entity.getContentType());  

            //内容的编码格式  

            System.out.println(entity.getContentEncoding());  

            //内容的长度  

            System.out.println(entity.getContentLength());  

            //把内容转成字符串  

            System.out.println(EntityUtils.toString(entity));  

            //内容转成字节数组  

            System.out.println(EntityUtils.toByteArray(entity).length);  

            //还有个直接获得流  

            //entity.getContent();  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息