HttpClient详细使用示例

HttpClient的主要功能:

实现了所有 HTTP 的方法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
支持 HTTPS 协议
支持代理服务器(Nginx等)等
支持自动(跳转)转向

org.apache.httpcomponents</ groupId>
httpclient
4.5.5


com.alibaba</ groupId>
fastjson
1.2.47

/**
 * GET---无参测试
 *
 */
@Test
public void doGetTestOne() {
	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();
	// 创建Get请求
	HttpGet httpGet = new HttpGet("http://localhost:12345/doGetControllerOne");

	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 由客户端执行(发送)Get请求
		response = httpClient.execute(httpGet);
		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();
		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* GET—有参测试 (方式一:手动在url后面加上参数)

 */
@Test
public void doGetTestWayOne() {
	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 参数
	StringBuffer params = new StringBuffer();
	try {
		// 字符数据最好encoding以下;这样一来,某些特殊字符才能传过去(如:某人的名字就是“&”,不encoding的话,传不过去)
		params.append("name=" + URLEncoder.encode("&", "utf-8"));
		params.append("&");
		params.append("age=24");
	} catch (UnsupportedEncodingException e1) {
		e1.printStackTrace();
	}

	// 创建Get请求
	HttpGet httpGet = new HttpGet("http://localhost:12345/doGetControllerTwo" + "?" + params);
	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 配置信息
		RequestConfig requestConfig = RequestConfig.custom()
				// 设置连接超时时间(单位毫秒)
				.setConnectTimeout(5000)
				// 设置请求超时时间(单位毫秒)
				.setConnectionRequestTimeout(5000)
				// socket读写超时时间(单位毫秒)
				.setSocketTimeout(5000)
				// 设置是否允许重定向(默认为true)
				.setRedirectsEnabled(true).build();

		// 将上面的配置信息 运用到这个Get请求里
		httpGet.setConfig(requestConfig);

		// 由客户端执行(发送)Get请求
		response = httpClient.execute(httpGet);

		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();
		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* GET—有参测试 (方式二:将参数放入键值对类中,再放入URI中,从而通过URI得到HttpGet实例)
*
*
*/
@Test
public void doGetTestWayTwo() {
// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 参数
	URI uri = null;
	try {
		// 将参数放入键值对类NameValuePair中,再放入集合中
		List<NameValuePair> params = new ArrayList<>();
		params.add(new BasicNameValuePair("name", "&"));
		params.add(new BasicNameValuePair("age", "18"));
		// 设置uri信息,并将参数集合放入uri;
		// 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
		uri = new URIBuilder().setScheme("http").setHost("localhost")
				              .setPort(12345).setPath("/doGetControllerTwo")
				              .setParameters(params).build();
	} catch (URISyntaxException e1) {
		e1.printStackTrace();
	}
	// 创建Get请求
	HttpGet httpGet = new HttpGet(uri);

	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 配置信息
		RequestConfig requestConfig = RequestConfig.custom()
				// 设置连接超时时间(单位毫秒)
				.setConnectTimeout(5000)
				// 设置请求超时时间(单位毫秒)
				.setConnectionRequestTimeout(5000)
				// socket读写超时时间(单位毫秒)
				.setSocketTimeout(5000)
				// 设置是否允许重定向(默认为true)
				.setRedirectsEnabled(true).build();

		// 将上面的配置信息 运用到这个Get请求里
		httpGet.setConfig(requestConfig);

		// 由客户端执行(发送)Get请求
		response = httpClient.execute(httpGet);

		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();
		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* POST—无参测试
*

 */
@Test
public void doPostTestOne() {

	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 创建Post请求
	HttpPost httpPost = new HttpPost("http://localhost:12345/doPostControllerOne");
	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 由客户端执行(发送)Post请求
		response = httpClient.execute(httpPost);
		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();

		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* POST—有参测试(普通参数)
*
*/
@Test
public void doPostTestFour() {

	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 参数
	StringBuffer params = new StringBuffer();
	try {
		// 字符数据最好encoding以下;这样一来,某些特殊字符才能传过去(如:某人的名字就是“&”,不encoding的话,传不过去)
		params.append("name=" + URLEncoder.encode("&", "utf-8"));
		params.append("&");
		params.append("age=24");
	} catch (UnsupportedEncodingException e1) {
		e1.printStackTrace();
	}

	// 创建Post请求
	HttpPost httpPost = new HttpPost("http://localhost:12345/doPostControllerFour" + "?" + params);

	// 设置ContentType(注:如果只是传普通参数的话,ContentType不一定非要用application/json)
	httpPost.setHeader("Content-Type", "application/json;charset=utf8");

	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 由客户端执行(发送)Post请求
		response = httpClient.execute(httpPost);
		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();

		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* POST—有参测试(对象参数)
*

 */
@Test
public void doPostTestTwo() {

	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 创建Post请求
	HttpPost httpPost = new HttpPost("http://localhost:12345/doPostControllerTwo");
	User user = new User();
	user.setName("潘晓婷");
	user.setAge(18);
	user.setGender("女");
	user.setMotto("姿势要优雅~");
	// 我这里利用阿里的fastjson,将Object转换为json字符串;
	// (需要导入com.alibaba.fastjson.JSON包)
	String jsonString = JSON.toJSONString(user);

	StringEntity entity = new StringEntity(jsonString, "UTF-8");

	// post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
	httpPost.setEntity(entity);

	httpPost.setHeader("Content-Type", "application/json;charset=utf8");

	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 由客户端执行(发送)Post请求
		response = httpClient.execute(httpPost);
		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();

		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
/**
* POST—有参测试(普通参数 + 对象参数)
*
* @date 2018年7月13日 下午4:18:50
*/
@Test
public void doPostTestThree() {

	// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
	CloseableHttpClient httpClient = HttpClientBuilder.create().build();

	// 创建Post请求
	// 参数
	URI uri = null;
	try {
		// 将参数放入键值对类NameValuePair中,再放入集合中
		List<NameValuePair> params = new ArrayList<>();
		params.add(new BasicNameValuePair("flag", "4"));
		params.add(new BasicNameValuePair("meaning", "这是什么鬼?"));
		// 设置uri信息,并将参数集合放入uri;
		// 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
		uri = new URIBuilder().setScheme("http").setHost("localhost").setPort(12345)
				.setPath("/doPostControllerThree").setParameters(params).build();
	} catch (URISyntaxException e1) {
		e1.printStackTrace();
	}

	HttpPost httpPost = new HttpPost(uri);
	// HttpPost httpPost = new
	// HttpPost("http://localhost:12345/doPostControllerThree1");

	// 创建user参数
	User user = new User();
	user.setName("潘晓婷");
	user.setAge(18);
	user.setGender("女");
	user.setMotto("姿势要优雅~");

	// 将user对象转换为json字符串,并放入entity中
	StringEntity entity = new StringEntity(JSON.toJSONString(user), "UTF-8");

	// post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
	httpPost.setEntity(entity);

	httpPost.setHeader("Content-Type", "application/json;charset=utf8");

	// 响应模型
	CloseableHttpResponse response = null;
	try {
		// 由客户端执行(发送)Post请求
		response = httpClient.execute(httpPost);
		// 从响应模型中获取响应实体
		HttpEntity responseEntity = response.getEntity();

		System.out.println("响应状态为:" + response.getStatusLine());
		if (responseEntity != null) {
			System.out.println("响应内容长度为:" + responseEntity.getContentLength());
			System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
		}
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 释放资源
			if (httpClient != null) {
				httpClient.close();
			}
			if (response != null) {
				response.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述

文件

org.apache.httpcomponents
httpmime
4.5.5

‘’
/**
*

  • 发送文件
  • multipart/form-data传递文件(及相关信息)
  • 注:如果想要灵活方便的传输文件的话,
  • 除了引入org.apache.httpcomponents基本的httpclient依赖外
  • 再额外引入org.apache.httpcomponents的httpmime依赖。
  • 追注:即便不引入httpmime依赖,也是能传输文件的,不过功能不够强大。

*/
@Test
public void test4() {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(“http://localhost:12345/file”);
CloseableHttpResponse response = null;
try {
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
// 第一个文件
String filesKey = “files”;
File file1 = new File(“C:\Users\JustryDeng\Desktop\back.jpg”);
multipartEntityBuilder.addBinaryBody(filesKey, file1);
// 第二个文件(多个文件的话,使用同一个key就行,后端用数组或集合进行接收即可)
File file2 = new File(“C:\Users\JustryDeng\Desktop\头像.jpg”);
// 防止服务端收到的文件名乱码。 我们这里可以先将文件名URLEncode,然后服务端拿到文件名时在URLDecode。就能避免乱码问题。
// 文件名其实是放在请求头的Content-Disposition里面进行传输的,如其值为form-data; name=“files”; filename=“头像.jpg”
multipartEntityBuilder.addBinaryBody(filesKey, file2, ContentType.DEFAULT_BINARY, URLEncoder.encode(file2.getName(), “utf-8”));
// 其它参数(注:自定义contentType,设置UTF-8是为了防止服务端拿到的参数出现乱码)
ContentType contentType = ContentType.create(“text/plain”, Charset.forName(“UTF-8”));
multipartEntityBuilder.addTextBody(“name”, “邓沙利文”, contentType);
multipartEntityBuilder.addTextBody(“age”, “25”, contentType);

  HttpEntity httpEntity = multipartEntityBuilder.build();
  httpPost.setEntity(httpEntity);

  response = httpClient.execute(httpPost);
  HttpEntity responseEntity = response.getEntity();
  System.out.println("HTTPS响应状态为:" + response.getStatusLine());
  if (responseEntity != null) {
     System.out.println("HTTPS响应内容长度为:" + responseEntity.getContentLength());
     // 主动设置编码,来防止响应乱码
     String responseStr = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
     System.out.println("HTTPS响应内容为:" + responseStr);
  }

} catch (ParseException | IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

在这里插入图片描述
/**
*

  • 发送流

*/
@Test
public void test5() {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(“http://localhost:12345/is?name=邓沙利文”);
CloseableHttpResponse response = null;
try {
InputStream is = new ByteArrayInputStream(“流啊流~”.getBytes());
InputStreamEntity ise = new InputStreamEntity(is);
httpPost.setEntity(ise);

  response = httpClient.execute(httpPost);
  HttpEntity responseEntity = response.getEntity();
  System.out.println("HTTPS响应状态为:" + response.getStatusLine());
  if (responseEntity != null) {
     System.out.println("HTTPS响应内容长度为:" + responseEntity.getContentLength());
     // 主动设置编码,来防止响应乱码
     String responseStr = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
     System.out.println("HTTPS响应内容为:" + responseStr);
  }

} catch (ParseException | IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值