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

yizhihongxing

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日

相关文章

  • 全面解析Spring Security 过滤器链的机制和特性

    全面解析Spring Security 过滤器链的机制和特性 什么是Spring Security过滤器链? Spring Security过滤器链是Spring Security处理HTTP请求的核心组件之一。在Spring Security框架中,每一个安全的URL请求都需要通过一系列的过滤器组成的过滤器链来进行权限的校验和身份认证,该过滤器链是有顺序的…

    Java 2023年5月20日
    00
  • java中类与对象的使用详情

    下面我将详细介绍“Java中类与对象的使用”。 类与对象的基本概念 在Java中,类是一种抽象的数据类型,它是一组相关属性和方法的集合。而对象则是类的实例化,它可以调用类中定义的方法或访问类中定义的属性。 定义类 定义类的语法格式如下: public class ClassName { // 定义属性 // 定义方法 } 其中,public是访问控制符,表示…

    Java 2023年5月26日
    00
  • 一篇文章带你入门Java变量及整形

    一篇文章带你入门Java变量及整形 什么是变量? 变量就是在程序执行期间可以发生变化的量。Java是一种强类型语言,声明变量时需要指定变量类型。 声明变量 在Java中声明变量时,需要指定变量的类型,语法为: type name; 其中,type表示变量类型,name表示变量名。例如,声明一个整型变量age: int age; 表示声明一个名为age的整型变…

    Java 2023年5月23日
    00
  • Java中的Runnable接口是什么?

    Java中的Runnable接口是一种用于定义线程任务的接口。该接口中只包含一个run()方法,线程通过调用该方法来执行任务。与继承Thread类相比,实现Runnable接口可以更好地体现面向对象的设计模式,并且可以让任务更加灵活地执行。 public interface Runnable { public abstract void run(); } 在…

    Java 2023年4月27日
    00
  • SpringBoot FreeWorker模板技术解析

    SpringBoot FreeMarker模板技术解析 什么是FreeMarker模板引擎 FreeMarker是一款基于模板的Java模板引擎,它可以将模板和数据混合在一起生成输出文本,常用于动态生成HTML,XML,电子邮件等文本。 FreeMarker的特点: 容易创建和维护模板 可以产生非常多的输出格式(HTML,XML,XHTML,PDF等等) 可…

    Java 2023年5月19日
    00
  • Java struts2 validate用户登录校验功能实现

    下面是Java struts2 validate用户登录校验功能实现的完整攻略。 准备工作 确保本地安装了Java和Struts2框架 创建项目目录和基本的MVC架构 实现步骤 1. 创建登录表单和登录处理Action类 在jsp页面中创建登录表单,包括用户名和密码两个输入框。然后在后台Action类中编写处理登录请求的方法,通过接收表单中提交的参数,将其传…

    Java 2023年5月20日
    00
  • 一文详解Java闭锁和栅栏的实现

    一文详解Java闭锁和栅栏的实现 1. 什么是闭锁和栅栏 在并发编程中,有时需要等待某个操作的完成,或者协调多个线程的执行。Java提供了闭锁(Latch)和栅栏(Barrier)两个机制来实现这种协调。 闭锁是一种同步工具,可以使线程等待一个或多个线程的操作完成。闭锁一般会在某个线程等待另一个线程完成任务时使用。 栅栏是一种同步工具,它允许一组线程在某个点…

    Java 2023年5月26日
    00
  • JSP中图片的上传与显示方法实例详解

    下面就为大家详细讲解一下“JSP中图片的上传与显示方法实例详解”的完整攻略。 1. 确认上传的文件类型 在上传图片前,我们需要确认上传的文件类型,以防止一些不合法的文件被上传。可以通过以下代码片段实现: String fileName = fileItem.getName(); String extName = fileName.substring(file…

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