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 转对象封装 没对上。
java 发送 http 请求练习两年半(HttpURLConnection)的更多相关文章
- Java发送HTTPS请求
前言 上篇文章介绍了 java 发送 http 请求,大家都知道发送http是不安全的 .我也是由于对接了其他企业后总结了一套发送 https的工具.大家网上找方法很多的,但是可不是你粘过来就能用啊, ...
- 使用Java发送Http请求的内容
公司要将自己的产品封装一个WebService平台,所以最近开始学习使用Java发送Http请求的内容.这一块之前用PHP的时候写的也比较多,从用最基本的Socket和使用第三方插件都用过. 学习了J ...
- Java发送Http请求并获取状态码
通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...
- 通过java发送http请求
通常的http请求都是由用户点击某个连接或者按钮来发起的,但是在一些后台的Java程序中需要发送一些get或这post请求,因为不涉及前台页面,该怎么办呢? 下面为大家提供一个Java发送http请求 ...
- 编写爬虫(spider)的预备知识:用java发送HTTP请求
使用原生API来发送http请求,而不是使用apache的库,原因在于这个第三方库变化实在太快了,每个版本都有不小的变化.对于程序员来说,使用它反而会有很多麻烦,比如自己曾经写过的代码将无法复用. 原 ...
- JAVA发送HttpClient请求及接收请求结果
1.写一个HttpRequestUtils工具类,包括post请求和get请求 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
- (转)Java发送http请求(get 与post方法请求)
本文转载于:http://bijian1013.iteye.com/blog/2166855 package com.bijian.study; import java.io.BufferedRead ...
- Java 发送 Https 请求工具类 (兼容http)
依赖 jsoup-1.11.3.jar <dependency> <groupId>org.jsoup</groupId> <artifactId>js ...
- Java发送socket请求的工具
package com.tech.jin.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import ...
- Java发送Http请求
package com.liuyu.test; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...
随机推荐
- B3610 [图论与代数结构 801] 无向图的块 题解
题目传送门 前言 本题解内容均摘自我的 Tarjan 学习笔记 . 解法 Tarjan 与无向图 无向图与割点(割顶) 在一个无向图中,不存在横叉边(因为边是双向的). 一个无向图中,可能不止存在一个 ...
- JS leetcode 多数元素 题解分析
壹 ❀ 引 做题做题,再忙每天都要抽空做一道题!今天来做一道有趣的题,题目来自多数元素,题目描述如下: 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ ...
- DRF解决跨域问题
Django Rest Framework提供了corsheaders模块解决跨域问题 安装模块 pip3.9 install django-cors-headers 注册应用 # 注册 corshe ...
- S905L3A(M401A)拆解, 运行EmuELEC和Armbian
关于S905L3A / S905L3AB S905Lx系列没有公开资料, 猜测是Amlogic用于2B的芯片型号, 最早的 S905LB 是 S905X 的马甲, 而这个 S905L3A/S905L3 ...
- Java Socket编程系列(四)开发支持多客户端访问的Server
例子来自Java官方教程,稍作调整. 上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作. 协议类(和系列三一样没变): package co ...
- C++ { } 的使用场景
{} 可以用于初始化 C++11 中的变量,就像它们用于初始化 C 中的数组和结构一样. {} 主要是为了提供语法的一致性(使用 {} 初始化将在所有上下文中都有效,而使用赋值运算符或()初始化将在特 ...
- 【Android 抓包对抗】客户端证书和域名校验绕过
1. 按照之前的方式(https://www.cnblogs.com/gradyblog/p/17197707.html)进行抓包发现证书校验失败 SSL handshake with client ...
- Vim常用快捷键汇总
跳到指定行 在命令行模式下输入: :n(n为指定行号)
- Thinkpad T14 AMD版无线网卡不可用
硬件环境: Thinkpad T14 AMD 操作系统: Windows 10家庭版 问题描述: Windows 10在后台默默做了补丁更新,导致无线网卡和蓝牙鼠标都不可用(但是有线网却是能正常工作的 ...
- Telegraph多线程下载器v0.5--tkinter
介绍 最近在拿python写一点小工具,结合之前的多线程.线程池技术做了个GUI版的Telegraph图册批量下载工具. 因为开发平台是在Mac,虽然对Windows平台的也进行了打包,但最垃圾的Wi ...