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

阅读剩余 69%

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

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

相关文章

  • 在Struts2中如何将父类属性序列化为JSON格式的解决方法

    在Struts2中将父类属性序列化为JSON格式的问题,可以通过使用配置文件和Action的一些属性或方法来解决。以下是实现此目的的两种方法: 方法一:在配置文件中配置json.name和json.includeProperties通过在struts.xml配置文件中使用json.name和json.includeProperties来自定义一个JSON插件…

    Java 2023年5月20日
    00
  • Java正则表达式API Matcher类方法

    接下来我会为你详细讲解Java正则表达式API Matcher类方法的完整攻略。 什么是Java正则表达式? Java正则表达式是一种文本模式,用于匹配文本中的字符序列。它们通常用于搜索、替换和验证字符串。Java正则表达式由Pattern类表示,它有一个compile()方法,用于将正则表达式编译为一个Pattern对象。Matcher类提供了对字符串的匹…

    Java 2023年5月27日
    00
  • Java开发之内部类对象的创建及hook机制分析

    Java开发之内部类对象的创建及hook机制分析 在Java中,内部类是定义在其他类中的类。内部类的创建方式和使用方式不同于普通类,需要注意一些细节和特殊机制。本篇攻略将详细讲解内部类对象的创建和hook机制。 内部类的创建 静态内部类的创建 静态内部类是在一个类内部定义的静态类。静态内部类的创建方式如下: public class OuterClass {…

    Java 2023年5月26日
    00
  • Java中ShardingSphere分库分表实战

    关于Java中ShardingSphere分库分表的实战攻略,我将从以下几个方面进行讲解: 简介:什么是ShardingSphere分库分表 分库分表实战攻略:分库分表的具体实现步骤 示例1:如何使用ShardingSphere进行分库分表 示例2:如何根据业务自定义Sharding规则 1. 简介 ShardingSphere是一款非常流行的数据库分库分表…

    Java 2023年5月19日
    00
  • spring security结合jwt实现用户重复登录处理

    下面我会详细讲解“spring security结合jwt实现用户重复登录处理”的完整攻略。 概述 在使用JWT(Json Web Token)作为身份认证的情况下,用户可以随时提供令牌来访问应用程序,这使得应用程序无法管理用户的会话状态,例如强制注销用户或在重复登录情况下限制访问。为了解决这个问题,我们可以使用Spring Security来管理用户登录状…

    Java 2023年6月3日
    00
  • Java8方法引用和构造引用代码实例

    针对“Java8方法引用和构造引用代码实例”的完整攻略,我这里给出了以下步骤: 1. 概念介绍 首先需要了解方法引用和构造引用的概念。方法引用就是引用一个已经存在的函数,而不是像Lambda表达式那样提供一个匿名函数实现。其中有三种主要的引用类型: 静态方法引用:引用静态函数。 实例方法引用:引用实例方法。 构造方法引用:引用类的构造方法。 构造引用与方法引…

    Java 2023年5月30日
    00
  • SpringBoot整合JPA方法及配置解析

    关于SpringBoot整合JPA方法及配置解析的完整攻略,我给你详细讲解一下。 什么是JPA JPA(Java Persistence API)是Sun为JavaEE开发量身定制的一套API,用于处理对象与关系数据库的映射(Object Relational Mapping)问题。 通过JPA,我们可以使用Java类和对象来操作关系型数据库,而不需要写直接…

    Java 2023年5月20日
    00
  • JAVAEE model1模型实现商品浏览记录(去除重复的浏览记录)(一)

    JavaEE Model1模型实现商品浏览记录(去除重复的浏览记录)的攻略大致分为以下几个步骤: Step1:分析需求,确定数据结构 首先,需要确定需要保存哪些数据。在本场景中,需要保存用户的浏览记录,因此需要保存的数据包括商品ID(item_id)和浏览时间(view_time)。 为了去除重复的浏览记录,需要使用Java集合类HashSet来保存用户的浏…

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