最近在开发过程中,遇到了我们公司的几个老项目,采用的是传统单体项目,这种项目之间需要交互,项目A请求项目B,B将结果回调给A,我们采用了Http Post请求的方式,在接收Http请求的时候,遇到了不少问题,所以总结一下接收Http Post请求的几种方式。

1.@RequestBody注解直接接收

请求类型必须是:application/json

 /*** 主动请求方-A*/@PostMapping("request-callback")public static void requestCallback() {TreeMap<String, String> map = new TreeMap<>();map.put("name", "六六");map.put("age", "2");map.put("version", "1.0");String response;try {response = RequestUtil.post("http://127.0.0.1:8080/callback/response-callback", map);} catch (Exception e) {throw new RuntimeException("请求异常!");}LOGGER.info("回调返回 response = :{}", response);}// 项目A日志结果:回调返回 response = :回调成功!/*** 接收请求方-B-1*/@PostMapping("response-callback")public String responseCallback(@RequestBody CallbackDTO callbackDTO) {if (callbackDTO != null) {LOGGER.info("dto:{}", JSON.toJSONString(callbackDTO));return "回调成功!";}return "回调失败!";}// 项目B日志结果:dto:{"age":2,"name":"六六","version":"1.0"}

2.WebUtils.getParametersStartingWith(request, “”) 表单方式接收

  • 熟悉JavaWeb开发的同学应该都知道request中有一个方法叫做request.getParameterMap() ,返回一个Map;

比如,前端提交一个表单:

<input type="text" name="p_name" value="六六">
<input type="text" name="p_age" value="2">
<input type="text" name="f_sex" value="女">

request.getParameterMap()会得到一个Map:

{p_name=六六, p_age=2, f_sex=女}

但是我们后端可能只需要带"p_"这个前缀的字段,这时我们就可以用WebUtils.getParametersStartingWith(request, “p_”)这个方法去指定获取带"p_"前缀的字段,返回值也是一个Map。它会去掉前缀并且将不是"p_"前缀的字段过滤掉:

{name=六六, age=2}

也可以不传参,WebUtils.getParametersStartingWith(request, “”),他获取的结果和request.getParameterMap()一样:

{p_name=六六, p_age=2, f_sex=女}
  • 同样的,如果请求类型是 “Content-Type”,“application/x-www-form-urlencoded” 时,也可以使用这个方法去接收;
 /*** 主动请求方-A*/@PostMapping("request-callback")public static void requestCallback() {TreeMap<String, String> map = new TreeMap<>();map.put("p_name", "六六");map.put("p_age", "2");map.put("f_version", "1.0");String response;try {response = RequestUtil.post("http://127.0.0.1:8080/callback/response-callback", map);} catch (Exception e) {throw new RuntimeException("请求异常!");}LOGGER.info("回调返回 response = :{}", response);}// 项目A日志结果:回调返回 response = :回调成功!/*** 接收请求方-B-2*/@PostMapping("response-callback")public String responseCallback() {Map<String, Object> params = WebUtils.getParametersStartingWith(request, "p_");LOGGER.info("params :{}", JSON.toJSONString(params));return "回调成功!";}// 项目B日志结果:params :{"age":"2","name":"六六"}

和我们预想的一样,项目B接收到了请求,获取到了"p_"前缀的参数,将前缀自动去掉,并且给了项目B回调结果。

3.request.getReader()的方式接收

 /*** 主动请求方-A*/@PostMapping("request-callback")public static void requestCallback() {TreeMap<String, String> map = new TreeMap<>();map.put("name", "六六");map.put("age", "2");map.put("version", "1.0");String response;try {response = RequestUtil.post("http://127.0.0.1:8080/callback/response-callback", map);} catch (Exception e) {throw new RuntimeException("请求异常!");}LOGGER.info("回调返回 response = :{}", response);}// 项目A日志结果:回调返回 response = :回调成功!/*** 接收请求方-B-3*/@PostMapping("response-callback")public String responseCallback() {String content;try {StringBuilder sb = new StringBuilder();String line;while (!StringUtils.isBlank((line = request.getReader().readLine()))) {sb.append(line);}content = sb.toString();LOGGER.info("content = {}", content);} catch (Exception e) {LOGGER.error("msg={},stack={}", e.getMessage(), ExceptionUtils.getStackTrace(e));}return "回调成功!";}// 项目B日志结果:content = {"age":"2","name":"六六","version":"1.0"}

使用request.getInputStream()返回请求内容字节流一样可以获取。

4.工具类

我使用的Http请求工具类有两个,一个是hutool工具类,一个自己封装的。

<!--hutool工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.1.8</version>
</dependency>
/*** fshows.com* Copyright (C) 2013-2019 All Rights Reserved.*/
package com.example.callbackdemo.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;import java.io.IOException;/*** post请求工具类* @author liuyuan*/
@Slf4j
public class RequestUtils {/*** 超时时间10秒*/private static final int TIMEOUT = 10000;public static String post(String url, Object object) {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(TIMEOUT).setConnectTimeout(TIMEOUT).build();String content = null;HttpPost post = new HttpPost(url);post.addHeader("Content-Type", "application/json");post.setConfig(requestConfig);String body = JSON.toJSONString(object, SerializerFeature.WriteNullStringAsEmpty);log.info("执行POST请求 body={}", body);post.setEntity(new StringEntity(body, "UTF-8"));try {CloseableHttpClient client = HttpClientBuilder.create().build();CloseableHttpResponse closeableHttpResponse = client.execute(post);content = EntityUtils.toString(closeableHttpResponse.getEntity(), "UTF-8");} catch (IOException e) {log.warn("执行POST请求异常params={},e={}", JSON.toJSONString(object), ExceptionUtils.getStackTrace(e));} finally {post.releaseConnection();}return content;}
}

5.总结

request.getParameter()、request.getInputStream()、request.getReader()和@RequestBody注解是互斥的,只能调用其中一个,如果想要同时使用,需要做特殊处理。

接收Http请求的几种方式相关推荐

  1. java 接收json 字符串_spring接收json字符串的两种方式

    一.前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到.自己测试接口时使用postman的form- ...

  2. curl 发送 POST 请求的四种方式

    使用 curl 发送 POST 请求的四种方式: application/x-www-form-urlencoded 使用实例 $ curl localhost:3000/api/basic -X P ...

  3. 探讨Netty获取并检查Websocket握手请求的两种方式

    在使用Netty开发Websocket服务时,通常需要解析来自客户端请求的URL.Headers等等相关内容,并做相关检查或处理.本文将讨论两种实现方法. 方法一:基于HandshakeComplet ...

  4. Java 实现 HTTP 请求的三种方式

    除了本文推荐的几种方式,强烈推荐 OkHttp 目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较 ...

  5. java实现HTTP请求的三种方式

    From: https://www.cnblogs.com/hhhshct/p/8523697.html 目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的 ...

  6. nginx负载均衡分发请求的几种方式

    nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. nginx的upstre ...

  7. java发送http get请求的两种方式

    长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset)throw ...

  8. 减少HTTP请求的四种方式

    由于HTTP1.1协议规定请求只能串行发送,也就是说一百个请求必须一次逐个发送,前面的一个请求完成才能发送下一个请求. 所以我们在开发的时候应该尽量减少HTTP请求,如下有4种方式: 1.使用图片地图 ...

  9. JavaScript实现同步Ajax请求的两种方式

    JavaScript的Ajax请求默认是异步的,有以下两种方式能让Ajax请求变成同步 方式一 使用ES7的Async和Await async function main(){const env = ...

最新文章

  1. 深度学习与工业互联网安全:应用与挑战
  2. Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
  3. 电脑CPU依然得看英特尔酷睿:新一代性能提升20%,AI能力翻5倍;网友:感谢AMD...
  4. 机械妖姬上门要源码后续结果来了!
  5. 《Python编程从入门到实践》学习笔记6:字典
  6. 飞鸽传书的这一新的通信方式采用云技术
  7. (转)Spring Boot(二十):使用 spring-boot-admin 对 Spring Boot 服务进行监控
  8. C++智能指针的“GC”
  9. Collectors.maxBy()和minBy()
  10. UE编辑器修改背景theme
  11. H5 前端JS添加水印
  12. 华为html阅读器 权限,在iReader阅读器上登录华为阅读
  13. win10磁盘分区合并(win10磁盘分区合并c盘时扩展卷点不开)
  14. PC端的TIM无法打开?打开“QPCore Service”服务 ,访问被拒?关掉杀毒软件
  15. Django Hello,Word!(Windows10)
  16. 什么是dB、dBm、dBc?
  17. 使用ChatGPT工具阅读文献的实战教程
  18. python-docx 合并单元格
  19. 设计抗混叠滤波器的三个指导原则--日记
  20. Python 抓取微信公众号账号信息

热门文章

  1. 要想成为JAVA高手必须先刻苦
  2. CS硕士妹子找工作经历
  3. 【Springboot】解决下载TXT文件,浏览器直接打开问题
  4. Realtek ALC268集成声卡驱动成绩在ubuntu下的处置责罚方案
  5. MIPSel PPoE拨号上网
  6. 关于郭天祥51单片机教程视频课后题《同时用两个定时器控制蜂鸣器发声》
  7. 敢达java_Java-Junit 的Hello world
  8. 百度没钱了!百度有钱联盟平台暂停推广
  9. 中科大计算机伯克利,从中科大到Berkeley, Princeton,一枚学霸的风雨追梦路
  10. python 实现股票MACD计算