java实现http请求的方法常用有两种,一种则是通过java自带的标准类HttpURLConnection去实现,另一种是通过apache的httpclient去实现。
本文用httpclient去实现,需要导入httpclient和httpcore两个jar包,测试时用的httpclient-4.5.1和httpcore-4.4.3。

HttpMethod.java

package demo;

public enum HttpMethod {
GET, POST;
}

HttpHeader.java

package demo;

import java.util.HashMap;
import java.util.Map; /**
* 请求头
*/
public class HttpHeader {
private Map<String, String> params = new HashMap<String, String>(); public HttpHeader addParam(String name, String value) {
this.params.put(name, value);
return this;
} public Map<String, String> getParams() {
return this.params;
}
}

HttpParamers.java

package demo;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import com.alibaba.fastjson.JSON; /**
* 请求参数
*/
public class HttpParamers {
private Map<String, String> params = new HashMap<String, String>();
private HttpMethod httpMethod;
private String jsonParamer = ""; public HttpParamers(HttpMethod httpMethod) {
this.httpMethod = httpMethod;
} public static HttpParamers httpPostParamers() {
return new HttpParamers(HttpMethod.POST);
} public static HttpParamers httpGetParamers() {
return new HttpParamers(HttpMethod.GET);
} public HttpParamers addParam(String name, String value) {
this.params.put(name, value);
return this;
} public HttpMethod getHttpMethod() {
return this.httpMethod;
} public String getQueryString(String charset) throws IOException {
if ((this.params == null) || (this.params.isEmpty())) {
return null;
}
StringBuilder query = new StringBuilder();
Set<Map.Entry<String, String>> entries = this.params.entrySet(); for (Map.Entry<String, String> entry : entries) {
String name = entry.getKey();
String value = entry.getValue();
query.append("&").append(name).append("=").append(URLEncoder.encode(value, charset));
}
return query.substring(1);
} public boolean isJson() {
return !isEmpty(this.jsonParamer);
} public Map<String, String> getParams() {
return this.params;
} public String toString() {
return "HttpParamers " + JSON.toJSONString(this);
} public String getJsonParamer() {
return this.jsonParamer;
} public void setJsonParamer() {
this.jsonParamer = JSON.toJSONString(this.params);
} private static boolean isEmpty(CharSequence cs) {
return (cs == null) || (cs.length() == 0);
}
}

HttpClient.java

package demo;

import java.io.IOException;
import java.util.Map;
import java.util.Set; import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; public class HttpClient {
public static final String DEFAULT_CHARSET = "UTF-8";
public static final String JSON_CONTENT_FORM = "application/json;charset=UTF-8";
public static final String CONTENT_FORM = "application/x-www-form-urlencoded;charset=UTF-8"; public static String doService(String url, HttpParamers paramers, HttpHeader header, int connectTimeout, int readTimeout) throws Exception {
HttpMethod httpMethod = paramers.getHttpMethod();
switch (httpMethod) {
case GET:
return doGet(url, paramers, header, connectTimeout, readTimeout);
case POST:
return doPost(url, paramers, header, connectTimeout, readTimeout);
}
return null;
} /**
* post方法
* @param url
* @param paramers
* @param header
* @param connectTimeout
* @param readTimeout
* @return
* @throws IOException
*/
public static String doPost(String url, HttpParamers paramers, HttpHeader header, int connectTimeout, int readTimeout) throws IOException {
String responseData = "";
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try{
String query = null;
HttpPost httpPost = new HttpPost(url);
setHeader(httpPost, header);
if (paramers.isJson()) {
//json数据
httpPost.setHeader(HTTP.CONTENT_TYPE, JSON_CONTENT_FORM);
query = paramers.getJsonParamer();
} else {
//表单数据
httpPost.setHeader(HTTP.CONTENT_TYPE, CONTENT_FORM);
query = paramers.getQueryString(DEFAULT_CHARSET);
}
if(query != null){
HttpEntity reqEntity = new StringEntity(query);
httpPost.setEntity(reqEntity);
}
httpClient = HttpClients.createDefault();
httpResponse = httpClient.execute(httpPost);
HttpEntity resEntity = httpResponse.getEntity();
responseData = EntityUtils.toString(resEntity);
} catch (Exception e){
e.printStackTrace();
} finally{
httpResponse.close();
httpClient.close();
}
return responseData;
} /**
* get方法
* @param url
* @param params
* @param header
* @param connectTimeout
* @param readTimeout
* @return
* @throws IOException
*/
public static String doGet(String url, HttpParamers params, HttpHeader header, int connectTimeout, int readTimeout) throws IOException {
String responseData = "";
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try{
String query = params.getQueryString(DEFAULT_CHARSET);
url = buildGetUrl(url, query);
HttpGet httpGet = new HttpGet(url);
setHeader(httpGet, header);
httpClient = HttpClients.createDefault();
httpResponse = httpClient.execute(httpGet);
HttpEntity resEntity = httpResponse.getEntity();
responseData = EntityUtils.toString(resEntity);
} catch (Exception e){
e.printStackTrace();
} finally{
httpResponse.close();
httpClient.close();
}
return responseData;
} private static void setHeader(HttpRequestBase httpRequestBase, HttpHeader header){
if(header != null){
Map<String,String> headerMap = header.getParams();
if (headerMap != null && !headerMap.isEmpty()) {
Set<Map.Entry<String, String>> entries = headerMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
String name = entry.getKey();
String value = entry.getValue();
httpRequestBase.setHeader(name, value);
}
}
}
} private static String buildGetUrl(String url, String query) throws IOException {
if (query == null || query.equals("")) {
return url;
}
StringBuilder newUrl = new StringBuilder(url);
boolean hasQuery = url.contains("?");
boolean hasPrepend = (url.endsWith("?")) || (url.endsWith("&"));
if (!hasPrepend) {
if (hasQuery) {
newUrl.append("&");
} else {
newUrl.append("?");
hasQuery = true;
}
}
newUrl.append(query);
hasPrepend = false;
return newUrl.toString();
}
}

HttpService.java

package demo;

import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; public class HttpService {
private String serverUrl;
private int connectTimeout = 15000;
private int readTimeout = 30000;
public HttpService(String serverUrl) {
this.serverUrl = serverUrl.trim();
}
public Map<String, Object> commonService(String serviceUrl, HttpParamers paramers) throws Exception{
return commonService(serviceUrl, paramers, null);
}
public Map<String, Object> commonService(String serviceUrl, HttpParamers paramers, HttpHeader header) throws Exception{
String response = service(serviceUrl, paramers, header);
try {
Map<String, Object> result = JSONObject.parseObject(response, new TypeReference<Map<String, Object>>() {});
if ((result == null) || (result.isEmpty())) {
throw new Exception("远程服务返回的数据无法解析");
}
Integer code = (Integer) result.get("code");
if ((code == null) || (code.intValue() != 0)) {
throw new Exception((String) result.get("message"));
}
return result;
} catch (Exception e) {
throw new Exception("返回结果异常,response:" + response, e);
}
}
public String service(String serviceUrl, HttpParamers paramers) throws Exception {
return service(serviceUrl, paramers, null);
}
public String service(String serviceUrl, HttpParamers paramers, HttpHeader header) throws Exception {
String url = this.serverUrl + serviceUrl;
String responseData = "";
try {
responseData = HttpClient.doService(url, paramers, header, this.connectTimeout, this.readTimeout);
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
return responseData;
} public String getServerUrl() {
return this.serverUrl;
} public int getConnectTimeout() {
return this.connectTimeout;
} public int getReadTimeout() {
return this.readTimeout;
} public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
} public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
}

测试例子Test1.java

package demo;

import org.junit.Ignore;
import org.junit.Test; public class Test1 { //免费的在线REST服务, 提供测试用的HTTP请求假数据
//接口信息说明可见:http://www.hangge.com/blog/cache/detail_2020.html
String uri = "http://jsonplaceholder.typicode.com"; //get方式请求数据
//请求地址:http://jsonplaceholder.typicode.com/posts
@Ignore("暂时忽略")
@Test
public void test1() {
System.out.print("\n" + "test1---------------------------"+ "\n");
HttpParamers paramers = HttpParamers.httpGetParamers();
String response = "";
try {
HttpService httpService = new HttpService(uri);
response = httpService.service("/posts", paramers);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print(response);
} //get方式请求数据
//请求地址:http://jsonplaceholder.typicode.com/posts?userId=5
@Ignore("暂时忽略")
@Test
public void test2() {
System.out.print("\n" + "test2---------------------------"+ "\n");
HttpParamers paramers = HttpParamers.httpGetParamers();
paramers.addParam("userId", "5");
String response = "";
try {
HttpService httpService = new HttpService(uri);
response = httpService.service("/posts", paramers);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print(response);
} //post方式请求数据
//请求地址:http://jsonplaceholder.typicode.com/posts
@Test
public void test3() {
System.out.print("\n" + "test3---------------------------"+ "\n");
HttpParamers paramers = HttpParamers.httpPostParamers();
paramers.addParam("time", String.valueOf(System.currentTimeMillis()));
String response = "";
try {
HttpService httpService = new HttpService(uri);
response = httpService.service("/posts", paramers);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print(response);
}
}

一个java的http请求的封装工具类的更多相关文章

  1. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  2. 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

    1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...

  3. Android OkHttp网络连接封装工具类

    package com.lidong.demo.utils; import android.os.Handler; import android.os.Looper; import com.googl ...

  4. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  5. Http请求通信(工具类)

    Http请求通信(工具类) 异步消息处理流程是: 首先需要在主线程当中创建一个Handle对象,并重写handlerMessage()方法. 然后当子线程中需要进行UI操作时,就创建一个Message ...

  6. Java判断不为空的工具类总结

    1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. package com.bie.util; import java.util.Collection; imp ...

  7. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  8. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  9. 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?

    一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?带着这个疑惑,动手建几个测试类, 揭开心中的疑惑.以下是解开疑惑过程: package test;/** * 一个.java源文件中可以 ...

随机推荐

  1. echarts 柱状图

    效果: 图一:Y轴显示百分比  柱状图定点显示数量个数 图二:x轴  相同日期对应的每个柱子显示不同类型的数量 代码: 容器: <div id="badQuaAnalyze" ...

  2. 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)

    先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...

  3. Android Gradle 学习笔记(四):Gradle 构建脚本

    本节我们从整体的角度来介绍一下Gradle. 一.setting.gradle 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认的名字就是setting.gradle, ...

  4. Java反射01 : 概念、入门示例、用途及注意事项

    1.Java反射定义 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79360452 官方定义如下: Reflection enabl ...

  5. requests---requests请求表单

    在做接口测试的时候我们会遇到过需要填写表单的形式,那么如何通过requests进行请求呢? 这里需要引入新的python的第3方库requests-toolbelt requests-toolbelt ...

  6. 浅谈python之利用pandas和openpyxl读取excel数据

    在自学到接口自动化测试时, 发现要从excel中读取测试用例的数据, 假如我的数据是这样的: 最好是每行数据对应着一条测试用例, 为方便取值, 我选择使用pandas库, 先安装 pip instal ...

  7. C++ class 内的 () 重载示例

    #include <iostream> // overloading "operator () " outside class //////////////////// ...

  8. 新工具解决消息丢失的bug

    最近在调查一个消息丢失的bug,所幸客户的文本文件里有丢失的记录,但在localdb文件里找不到. 我当时的想法是,在运行report的时候把丢失的记录从文本文件找出来,然后添加到localdb里,最 ...

  9. 【Collect】免费图片库网站推荐(国外高清可商用)

    #国外高清可商用免费图片库 1.https://unsplash.com/2.https://pixabay.com/3.https://www.sitebuilderreport.com/stock ...

  10. 前端笔记之Vue(四)UI组件库&Vuex&虚拟服务器初识

    一.日历组件 new Date()的月份是从0开始的. 下面表达式是:2018年6月1日 new Date(2018, 5, 1); 下面表达式是:2018年5月1日 new Date(2018, 4 ...