java 发送 http 请求练习两年半(HttpURLConnection)

1、起一个 springboot 程序做 http 测试:

    @GetMapping("/http/get")
    public ResponseEntity<String> testHttpGet(@RequestParam("param") String param) {
        System.out.println(param);
        return ResponseEntity.ok("---------> revive http get request --------->");
    }

    @PostMapping("/http/post")
    public ResponseEntity<String> testHttpPost(@RequestBody List<Object> body) {
        System.out.println(body);
        return ResponseEntity.ok("---------> receive http post request --------->");
    }

2、写一个 HttpURLConnection 自定义客户端

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class MyHttpClient {

    private final HttpURLConnection connection;

    private MyHttpClient(String url, Map<String, String> params) throws IOException {
        connection = buildConnection(url, params);
    }

    private MyHttpClient(String url, Map<String, String> params, String jsonBody) throws IOException {
        connection = buildConnection(url, params);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        connection.setDoOutput(true);

        try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
            outputStream.writeBytes(jsonBody);
            outputStream.flush();
        }
    }

    public static MyHttpClient get(String url, Map<String, String> params) throws IOException {
        return new MyHttpClient(url, params);
    }

    public static MyHttpClient post(String url, Map<String, String> params, String jsonBody) throws IOException {
        return new MyHttpClient(url, params, jsonBody);
    }

    /**
     * 创建 http 连接
     *
     * @param url    请求路径
     * @param params 请求参数,可以为空
     * @return http 连接
     */
    private HttpURLConnection buildConnection(String url, Map<String, String> params) throws IOException {
        String requestParams = getParamsString(params);
        return (HttpURLConnection) new URL(requestParams != null ? url + "?" + requestParams : url).openConnection();
    }

    /**
     * 获取 http 请求响应结果
     *
     * @return 响应结果,失败抛异常
     */
    public String getResponse() throws IOException {
        int responseCode = connection.getResponseCode();
        if (responseCode >= HttpURLConnection.HTTP_OK && responseCode < HttpURLConnection.HTTP_MULT_CHOICE) {
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }

            in.close();

            connection.disconnect();
            return response.toString();
        } else {
            connection.disconnect();
            InputStream errorStream = connection.getErrorStream();
            if (errorStream == null) {
                throw new ConnectException("request fail");
            }
            throw new ConnectException(new String(errorStream.readAllBytes(), StandardCharsets.UTF_8));
        }
    }

    /**
     * 拼接请求参数
     *
     * @param params 参数 map
     * @return 请求参数字符串
     */
    public static String getParamsString(Map<String, String> params) {
        if (params == null || params.isEmpty()) {
            return null;
        }

        StringBuilder result = new StringBuilder();

        for (Map.Entry<String, String> entry : params.entrySet()) {
            result.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
            result.append("&");
        }

        String resultString = result.toString();
        return resultString.length() > 0
                ? resultString.substring(0, resultString.length() - 1)
                : resultString;
    }
}

3、测试 get 和 post 请求

    public static void main(String[] args) throws IOException {

        MyHttpClient myHttpClient = MyHttpClient.get("http://127.0.0.1:8083/springboot/http/get",
                Map.of("param", "1"));
        String resultGet = myHttpClient.getResponse();
        System.out.println(resultGet);


        MyHttpClient httpClient = MyHttpClient.post("http://127.0.0.1:8083/springboot/http/post",
                null,
                "[1,2,3,4,5]");
        String resultPost = httpClient.getResponse();
        System.out.println(resultPost);

    }

4、控制台输出结果

---------> revive http get request --------->
---------> receive http post request --------->

Process finished with exit code 0

中间遇到一些坑,经常以为 http 会有方法像 openfeign 那样传入请求参数,忽略了路径拼接,

启动的 springboot 接收的 post 的请求体为 List 类型,且 Content-Type 是 json,在测试 post 请求时一直报错,看了 spring 控制台才发现 json 转对象封装 没对上。

原文链接:https://www.cnblogs.com/64gdrifbottle/p/17342357.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 发送 http 请求练习两年半(HttpURLConnection) - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • 详解Java基础知识——JDBC

    详解Java基础知识——JDBC JDBC的介绍 JDBC(Java Database Connectivity)是Java语言中用于操作关系型数据库的API,通过JDBC可以实现Java与数据库之间的交互。JDBC主要包含以下几个部分: DriverManager:驱动管理器,用于管理各种数据库驱动。 Connection:连接对象,用于与数据库建立连接。…

    Java 2023年5月19日
    00
  • jQuery内置的AJAX功能和JSON的使用实例

    下面我将为你讲解jQuery内置的AJAX功能和JSON的使用实例的完整攻略。 jQuery内置的AJAX功能 什么是AJAX? AJAX全称为Asynchronous JavaScript And XML,即异步的 JavaScript 和 XML 技术。它的核心思想是通过JavaScript创建异步请求,从而不需要在页面载入时更新整个页面。 jQuery…

    Java 2023年6月16日
    00
  • 使用weixin-java-miniapp配置进行单个小程序的配置详解

    使用weixin-java-miniapp配置进行单个小程序的配置,需要遵循下面的步骤: 1. 引入依赖 在pom.xml文件中引入以下依赖: <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-miniap…

    Java 2023年5月23日
    00
  • Java的Struts框架报错“ActionFormException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionFormException”错误。这个错误通常由以下原因之一起: 表单验证失败:如果表单验证失败,则可能会出现此错误。在这种情况下,需要检查表单验证规则以解决此问题。 表单数据类型不匹配:如果表单数据类型与ActionForm中定义的类型不匹配,则可能会出现此错误。在这种情况下,需要检查表单数据类型…

    Java 2023年5月5日
    00
  • Java实现医院管理系统

    Java实现医院管理系统完整攻略 简介 医院管理系统是一个涉及多种功能的系统,它包含的功能有:病人管理、医生排班、药品管理、患者预约挂号等。通过Java语言实现医院管理系统,可以大大提高医院管理的效率,同时也为医院的信息化建设做出了贡献。 技术选型 为了实现医院管理系统,我们需要选择适当的技术来支撑,具体如下: 后端框架:Spring Framework 数…

    Java 2023年5月19日
    00
  • 浅析java的foreach循环

    下面是针对“浅析Java的foreach循环”的完整攻略: 什么是foreach循环 foreach循环,也被称为增强型for循环,是Java语言中一种用于遍历数组和集合类的循环结构。通过foreach循环,我们可以简化数组和集合的遍历过程,不需要手动去控制下标或迭代器的使用。 foreach循环的语法 foreach循环的语法结构如下: for (元素类型…

    Java 2023年5月26日
    00
  • mybatis log4j2打印sql+日志实例代码

    MyBatis是Java企业级开发框架之一,提供了许多优秀的ORM映射解决方案。而Log4j2是一个高性能的Apache日志框架,具有强大的日志级别控制、日志格式设置等特性。在MyBatis项目中,将Log4j2与MyBatis结合使用可以更好地记录和查看SQL执行情况和错误日志,有助于排查问题和性能调优。 下面,我们将详细讲解如何使用Log4j2来在MyB…

    Java 2023年5月19日
    00
  • js定时器怎么写?就是在特定时间执行某段程序

    JS定时器可以通过两种方法实现,分别是使用setTimeout和setInterval函数。下面我将分别对这两种方法进行详细讲解,并提供示例说明。 使用setTimeout实现JS定时器 setTimeout函数用于在一段指定的时间后执行一次指定的代码。语法如下: setTimeout(function, delay, param1, param2, ……

    Java 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部