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日

相关文章

  • Kafka单节点伪分布式集群搭建实现过程详解

    Kafka单节点伪分布式集群搭建实现过程详解 背景介绍 Kafka是一种高吞吐量的分布式发布订阅消息系统,广泛应用于大数据领域。本文将介绍如何搭建一个Kafka单节点伪分布式集群。 搭建步骤 步骤1:下载和安装Kafka 在官网https://kafka.apache.org/downloads中下载最新的Kafka版本,并按照官方文档步骤进行安装。 步骤2…

    Java 2023年5月20日
    00
  • Java中的异常处理如何提高程序可扩展性?

    Java中的异常处理可以提高程序的可扩展性,因为它能够帮助程序员对程序的异常情况进行处理,并且使程序在处理异常时更加稳定和健壮。下面给出Java中异常处理的完整攻略: 异常概述 在Java中,异常是指在程序执行期间出现的不正常情况,比如说空指针引用、数组越界、除数为0等,这些异常情况将导致程序的崩溃或者是产生错误的结果。为了应对这些异常情况,Java提供了异…

    Java 2023年4月27日
    00
  • Java多线程Callable接口实现代码示例

    下面是Java多线程Callable接口实现的完整攻略步骤: 1.什么是Callable接口 Callable和Runnable类似,都是用来创建线程的接口,但是Callable的call()方法有返回值,并且可以抛出异常。 public interface Callable<V> { V call() throws Exception; } 2…

    Java 2023年5月19日
    00
  • idea中引入了gb2312编码的文件的解决方法

    下面是关于在IDEA中引入了GB2312编码的文件的解决方法的完整攻略: 标题 首先,需要了解一些关于编码的基础知识。GB2312是一种汉字编码,它包含了常用的中文汉字,但不支持很多生僻字和繁体字。在IDEA中,我们可能需要引入一些使用了GB2312编码的文件,但是默认的编码是UTF-8,如果我们不做任何处理,那么就会出现乱码的情况。接下来就让我们看看具体的…

    Java 2023年5月20日
    00
  • java json字符串转JSONObject和JSONArray以及取值的实例

    下面是完整攻略: java json字符串转JSONObject和JSONArray以及取值的实例 JSON是一种轻量级的数据交换格式。在Java中,我们可以使用内置的JSONObject和JSONArray类很方便地操作JSON格式的数据。接下来,我会为你详细讲解如何实现JSON字符串的转换和取值。 将JSON字符串转为JSONObject 在Java中,…

    Java 2023年5月26日
    00
  • 一文让你了解透彻Java中的IO模型

    一文让你了解透彻Java中的IO模型 IO模型简介 在计算机中,IO模型是处理输入输出数据流的方法。在Java中,提供了多种IO模型,包括BIO、NIO、AIO。 BIO: 同步阻塞IO,采用传统的输入输出流,每一个线程并发处理一个客户端的请求。 NIO: 同步非阻塞IO,采用通道和缓冲区的概念,可以用一个线程并发处理多个客户端的请求。 AIO: 异步非阻塞…

    Java 2023年5月26日
    00
  • Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

    针对“Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解”,我们来进行一次完整的攻略。 1. 动态SQL的概述 在Mybatis中,动态SQL用于将不同的SQL语句组合在一起,以便在运行时决定使用哪一个SQL语句。Mybatis使用了一些标记来支持动态SQL,包括if、choose、where、set、tr…

    Java 2023年5月20日
    00
  • java开发 线上问题排查命令详解

    Java开发 线上问题排查命令详解 在Java应用线上运行过程中可能会遇到各种问题,例如应用启动失败、性能瓶颈等等。本文将介绍一些常用的Java开发线上问题排查命令,帮助开发人员更快速、准确地定位问题。 查看应用状态 jps jps命令用于列出Java应用进程的PID(进程ID)和名称,可用于检查应用是否正常启动并在运行。 jps 输出示例: 1234 Ap…

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