Httpcli4.5发送http请求和post重定向

 

摘要: Java发送http请求有多种方式,一种是通过HTTPClient这种第三方的开源框架去实现。一种是HttpURLConnection去实现,这是java比较原生的发送http请求的方式,再实际开发中,使用HttpClient这种方式较多,功能也更加强大,本文就这种方式展开讨论

HttpClient介绍

   超文本传输​​协议(HTTP)可能是当今Internet上使用的最重要的协议。Web服务,具有网络功能的设备以及网络计算的增长继续将HTTP协议的作用扩展到用户驱动的Web浏览器之外,同时增加了需要HTTP支持的应用程序的数量。尽管java.net 软件包提供了用于通过HTTP访问资源的基本功能,但它并未提供许多应用程序所需的全部灵活性或功能。Jakarta Commons HttpClient 组件试图通过提供高效,最新且功能丰富的程序包来实现此空白,以实现最新HTTP标准和建议的客户端。

   HttpClient组件是 为扩展而设计的,同时提供了对基本HTTP协议的强大支持,对于构建HTTP感知的客户端应用程序(例如Web浏览器,Web服务客户端或利用或扩展HTTP协议进行分布式通信的系统)的任何人来说HttpClient组件都可能感兴趣。许多项目使用HttpClient提供核心的HTTP功能。

HttpClient历史

   HttpClient于2001年作为Jakarta Commons的子项目启动,该项目基于Jakarta Slide项目开发的代码 。它于2004年从Commons中提拔,毕业于另一个雅加达项目。2005年,在雅加达创建了HttpComponents项目,其任务是开发HttpClient 3.x的后继产品,并维护现有代码库,直到准备好接管新代码库为止。该共享项目,摇篮HttpClient的,离开雅加达 ,2007年成为一个独立的顶级项目。同年晚些时候, HttpComponents 该项目还离开了雅加达,成为一个独立的顶级项目,负责维护HttpClientCommons HttpClient项目现已停产,并且不再开发。它已被HttpClientHttpCore模块中Apache HttpComponents项目取代,它们提供了更好的性能和更大的灵活性。

  所以,在使用HTTPClient时要注意版本,HTTPCLient3.x和4.x的使用上有明显区别,本文使用的时HTTPClient4.5

HTTPClient4.5所需要的依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
</dependency>

 代码示例:

public class HttpClientRequest {

    /**
     * 通过url发送get请求并得到请求响应的结果
     *
     * @param url 请求的url
     * @return 响应的结果
     */
    public static String doGet(String url) {
        String result = "";
        // 通过址默认配置创建一个httpClient实例
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 创建httpGet远程连接实例
            HttpGet httpGet = new HttpGet(url);
            // 设置请求头信息,鉴权 请求的配置信息在实际开发中为了程序的健壮性和扩展性,应该在配置文件中进行配置
            httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // 设置配置请求参数
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
                    .setConnectionRequestTimeout(35000)// 请求超时时间
                    .setSocketTimeout(60000)// 数据读取超时时间
                    .build();
            // 为httpGet实例设置配置
            httpGet.setConfig(requestConfig);
            // 执行get请求得到返回对象
            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                // 通过返回对象获取返回数据
                HttpEntity entity = response.getEntity();
                // 通过EntityUtils中的toString方法将结果转换为字符串
                result = EntityUtils.toString(entity);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 发送post请求
     *
     * @param url
     * @param requestParam
     * @return
     */
    public static String doPost(String url, String requestParam) {
        String result = "";
        // 创建一个httpClient实例 配置post请求的重定向(如果使用默认配置httpClient默认get请求可以重定向,post的响应不可重定向)
        try (CloseableHttpClient httpClient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build()) {
            // 创建httpGet远程连接实例
            HttpPost httpPost = new HttpPost(url);
            // 请求的配置信息在实际开发中为了程序的健壮性和扩展性,应该在配置文件中进行配置
            // 设置配置请求参数
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
                    .setConnectionRequestTimeout(35000)// 请求超时时间
                    .setSocketTimeout(60000)// 数据读取超时时间
                    .build();
            // 为httpGet实例设置配置
            httpPost.setConfig(requestConfig);
            StringEntity stringEntity = new StringEntity(requestParam, "UTF-8");
            stringEntity.setContentEncoding("UTF-8");
            httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
            httpPost.setEntity(stringEntity);
            // 执行get请求得到返回对象
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 通过EntityUtils中的toString方法将结果转换为字符串
                result = EntityUtils.toString(response.getEntity());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

测试接口:

@RestController
public class TestController {

    @GetMapping("/httpClientGet")
    public String httpClientGet(String name) {
        return "hello httpClientGet!";
    }

    @PostMapping("/httpClientPost")
    public String httpClientPost(String name, int id) {
        System.out.println(name);
        return "hello httpClientPost!";
    }
}  

 

 单元测试:

public class HttpClientRequestTest {

    @Test
    public void doGetTest() {
        String url = "http://localhost:8080/httpClientGet?name=wang";
        String result = HttpClientRequest.doGet(url);
        String expect = "hello httpClientGet!";
        Assert.assertEquals(result, expect);
        System.out.println(result);
    }

    @Test
    public void doPostTest() {
        String url = "http://localhost:8080/httpClientPost";
        String requestParam = "name=wang&id=1";
        String result = HttpClientRequest.doPost(url, requestParam);
        String expect = "hello httpClientPost!";
        Assert.assertEquals(result, expect);
        System.out.println(result);
    }
}

  测试结果:

get:

 

 post:

 

 

 

  

posted @ 2019-11-26 20:50  旭龙先生  阅读(697)  评论(0编辑  收藏  举报