Java通过http请求的方式调用他人的接口

本功能的实现,全部参考于这篇博客,给这位大神点赞

基于Spring Boot使用Java调用http请求的6种方式

文章目录

  • 业务背景
  • 第一步,配置url
  • 第二步,封装请求体,RequestBody
  • 第三步,使用HttpURLConnection调用服务端的POST请求
  • 第四步,修改自己的代码
  • 第五步,分析请求过程
    • 1.JSON.toJSONString(offerBuyBack)
    • 2.读取json格式的数据接口,校验前端传参
    • 3.创建于url的连接设置连接参数
    • 4.像请求url里写请求参数
    • 5.发起http调用(getInputStream触发http请求)
    • 6.获取输入流读取数据
    • 7.格式化返回的数据
    • 8.根据需要返回的对象属性,遍历取出相应的字段
    • 9.关闭HttpURLConnection连接

业务背景

我在的部门的项目(官网项目)要以http请求的方式去调用别的部门(微服务项目)的接口。先来看下别的部门的http请求的参数和返回数据。如下图
在这里插入图片描述

第一步,配置url

这里http请求的url生产环境和测试环境是不同的,所以为了方便管理,这里将url的配置作为yml的配置项。

offerBuyBack:url: http://zuul.mircroservice-dev.10.xxx.xx.xx.nip.io/v1.0/StockService/function523

在这里插入图片描述
读取yml配置

@Value ("${offerBuyBack.url}")
private String url;

第二步,封装请求体,RequestBody

由业务背景我么可知,http的请求体Json格式如下

{"params":{"secu_code":"","market":"00"}
}也就是说“params”是数据头,params下又包含了多个像“market”这样的字段的参数。我是这样理解的:这里的请求体是一个有键值对的对象,params是key,而value就是实体对象。value里又封装了各种需要传递的参数属性,像market这样的属性等....

于是我封装的value的对象就是“F523OutputVo ”这个实体类,同时也是我用来回包的VO对象

public class F523OutputVo {String bond_name = "";String last_rate = "";String call_rate = "";String market = "";String bond_bal_amt = "";省略set和get方法...
}

最后再将F523OutputVo 这个对象嵌套进params里

public class OfferBuyBack {private F523OutputVo params;public F523OutputVo getParams() {return params;}public void setParams(F523OutputVo params) {this.params = params;}
}

第三步,使用HttpURLConnection调用服务端的POST请求

截取于开头转载的博客连接

/*** 1.使用HttpURLConnection调用服务端的POST请求* 服务端入参注解: @RequestBody*/public static void f1() throws Exception {// 1.请求URLString postUrl = "http://127.0.0.1:19091/server/comm/f1";// 2.请求参数JSON格式Map<String, String> map = new HashMap<>();map.put("userName", "HangZhou20220718");map.put("tradeName", "Vue进阶教程");String json = JSON.toJSONString(map);// 3.创建连接与设置连接参数URL urlObj = new URL(postUrl);HttpURLConnection httpConn = (HttpURLConnection) urlObj.openConnection();httpConn.setRequestMethod("POST");httpConn.setRequestProperty("Charset", "UTF-8");// POST请求且JSON数据,必须设置httpConn.setRequestProperty("Content-Type", "application/json");// 打开输出流,默认是falsehttpConn.setDoOutput(true);// 打开输入流,默认是true,可省略httpConn.setDoInput(true);// 4.从HttpURLConnection获取输出流和写数据OutputStream oStream = httpConn.getOutputStream();oStream.write(json.getBytes());oStream.flush();// 5.发起http调用(getInputStream触发http请求)if (httpConn.getResponseCode() != 200) {throw new Exception("调用服务端异常.");}// 6.从HttpURLConnection获取输入流和读数据BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));String resultData = br.readLine();System.out.println("从服务端返回结果: " + resultData);// 7.关闭HttpURLConnection连接httpConn.disconnect();}————————————————
版权声明:本文为CSDN博主「zhangbeizhen18」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangbeizhen18/article/details/125899199

第四步,修改自己的代码

参考上面的博主的代码后,我修改的自己的代码

@Controller
@Api(tags = "报价回购 StockService服务  523 接口")
@RequestMapping("/offerBuyBack")
public class OfferBuyBackController {protected final Logger logger = LoggerFactory.getLogger(this.getClass());@Value ("${offerBuyBack.url}")private String url;@RequestMapping(value = "/getBuyBackInfo",method = RequestMethod.POST)@ResponseBodypublic ServerResponse offerBuyBack(@RequestBody OfferBuyBack offerBuyBack){List<F523OutputVo> f523OutputVos= null;// 1.请求URLString postUrl = url;// 2.请求参数JSON格式String json = null;try {json = JSON.toJSONString(offerBuyBack);ObjectMapper objectMapper = new ObjectMapper();JsonNode jsonNode = objectMapper.readTree(json);//校验market的传参范围String market =jsonNode.findPath("market").asText();if(!StringUtils.isEmpty(market)){if(!"00".equals(market) && !"10".equals(market)){throw new Exception("参数错误");}}} catch (Exception e) {e.printStackTrace();return ServerResponse.createByErrorMessage("请求参数有误!");}HttpURLConnection httpConn = null;JSONArray obj = null;try {// 3.创建连接与设置连接参数URL urlObj = new URL(postUrl);httpConn = (HttpURLConnection) urlObj.openConnection();httpConn.setRequestMethod("POST");httpConn.setRequestProperty("Charset", "UTF-8");// POST请求且JSON数据,必须设置httpConn.setRequestProperty("Content-Type", "application/json");// 打开输出流,默认是falsehttpConn.setDoOutput(true);// 打开输入流,默认是true,可省略httpConn.setDoInput(true);// 4.从HttpURLConnection获取输出流和写数据OutputStream oStream = httpConn.getOutputStream();oStream.write(json.getBytes());oStream.flush();// 5.发起http调用(getInputStream触发http请求)if (httpConn.getResponseCode() != 200) {throw new Exception("调用服务端异常.");}// 6.从HttpURLConnection获取输入流和读数据BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));String resultData = br.readLine();logger.info("从服务端返回结果: " + resultData);JSONObject appleJsonObject= JSONObject.parseObject(resultData);obj = (JSONArray) appleJsonObject.get("data");if(obj.size()==0){return ServerResponse.createByErrorMessage("微服务查询结果报错!");}//定义需要显示的Vo对象F523OutputVo f523OutputVo = null;f523OutputVos = new ArrayList<>();for(int i= 0;i<obj.size();i++){f523OutputVo =new F523OutputVo();f523OutputVo.setBond_name((String) obj.getJSONObject(i).get("bond_name"));f523OutputVo.setCall_rate((String) obj.getJSONObject(i).get("call_rate"));f523OutputVo.setLast_rate((String) obj.getJSONObject(i).get("last_rate"));f523OutputVo.setMarket((String) obj.getJSONObject(i).get("market"));f523OutputVo.setBond_bal_amt((String)obj.getJSONObject(i).get("bond_bal_amt"));f523OutputVos.add(f523OutputVo);}// 7.关闭HttpURLConnection连接httpConn.disconnect();return ServerResponse.createBySuccess("成功",f523OutputVos);} catch (Exception e) {e.printStackTrace();}return  ServerResponse.createByErrorMessage("请求失败");}
}

第五步,分析请求过程

在这里插入图片描述

1.JSON.toJSONString(offerBuyBack)

在这里插入图片描述
在这里插入图片描述

2.读取json格式的数据接口,校验前端传参

在这里插入图片描述

3.创建于url的连接设置连接参数

在这里插入图片描述

4.像请求url里写请求参数

在这里插入图片描述

5.发起http调用(getInputStream触发http请求)

在这里插入图片描述

6.获取输入流读取数据

在这里插入图片描述

7.格式化返回的数据

在这里插入图片描述

8.根据需要返回的对象属性,遍历取出相应的字段

在这里插入图片描述

9.关闭HttpURLConnection连接

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录第一次带后端团队

在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发&#xff0c;记录这一次开发的经历。 1、背景介绍 首先说明一下背景。我所在的公司是做智慧社区相关业务&#xff0c;开发的项目是系统升级工具&#xff0c;方便公司实施同事安装和升级系统。 参与后…

华为OD机考算法题:分奖金

题目部分 题目分奖金难度难题目说明公司老板做了一笔大生意&#xff0c;想要给每位员工分配一些奖金&#xff0c;想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序&#xff0c;每个人随机抽取一个数字。按照工号的顺序往后排列&#xff0c;遇到第一个数字比自己数字…

JAVAWEB,tomcat,MVC

注意,这里有三大语言来实现动态网页技术 如果用户访问的是静态内容,比如固定html页面,web服务器就够了 其中,中间件帮忙处理很多东西,复杂的东西他来帮忙完成 正常来说,搭建web服务需要web服务器,web容器两个东西,但是tomcat相当于集成了这两个,不过有些项目里不会把tomcat当做…

zemax优化功能

1、三种优化方法 zemax的三种优化方法中&#xff0c;局部优化会找到局部的极小值点&#xff0c;全局优化会找到整体的最小值点。 锤形优化适用于先用全局优化找到大概值后&#xff0c;进一步完善光学系统 对于评价函数单调或者局部最小值就是全局最小值的情况&#xff0c;使…

java可以跨平台的原因是什么?

因为不同平台可以安装对应的JVM&#xff08;Java Virtual Machine&#xff09;&#xff0c;它是C/ C写的&#xff0c;JVM可以屏蔽所有和平台相关的信息&#xff0c;并帮助把Java文件经过编译后生成的和平台无关的class类文件&#xff08;也就是字节码&#xff09;从硬盘读取到内…

Kafka3.1部署和Topic主题数据生产与消费

文章目录 前言一、Kafka3.1X版本在Windows11主机部署二、Kafk生产Topic主题数据1.kafka生产数据2.JAVA kafka客户端消费数据 总结 前言 本章节主要讲述Kafka3.1X版本在Windows11主机下部署以及JAVA对Kafka应用&#xff1a; 一、Kafka3.1X版本在Windows11主机部署 1.安装JDK配…

微服务·架构组件之服务注册与发现-Nacos

微服务组件架构之服务注册与发现之Nacos Nacos服务注册与发现流程 服务注册&#xff1a;Nacos 客户端会通过发送REST请求的方式向Nacos Server注册自己的服务&#xff0c;提供自身的元数据&#xff0c;比如ip地址、端口等信息。 Nacos Server接收到注册请求后&#xff0c;就会…

四川百幕晟科技有限公司:抖音名称最多多少字?

在抖音上&#xff0c;用户可以为其帐户选择昵称&#xff0c;该昵称显示在用户的个人资料中。不过&#xff0c;很多人好奇&#xff0c;一个抖音昵称到底能有多少个字&#xff1f;本文将深入探讨抖音昵称长度限制以及一些最吸引人的昵称示例。 1、抖音昵称长度限制 抖音昵称的长度…

虚拟机的ubuntu 22.04无法联网问题解决

问题&#xff1a;虚拟机的ubuntu 22.04无法联网 解决&#xff1a; 找到一种配置的方式&#xff0c;使用命令&#xff1a;sudo dhclient -v

Python中的包管理方法

在Python开发中&#xff0c;包管理与依赖问题一直是开发者头疼的问题之一。随着项目规模的增大和复杂性的增加&#xff0c;管理各种依赖包和解决版本冲突变得尤为重要。本文将分享解决Python中的包管理与依赖问题的方法和工具&#xff0c;帮助开发者更好地管理项目中的依赖关系…

基于python+txt的学生成绩管理系统

基于pythontxt的学生成绩管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 录入学生信息查找学生信息删除学生信息修改学生信息排序统计学生信息显示所有学生信息 基于python的学生成绩管理系统&#xff0c;具备基本的增删改查功能&#xff0c;包…

宠物行业如何进行软文营销

如今&#xff0c;宠物已经成为了人们生活中不可或缺的一部分&#xff0c;大众对于萌宠的喜爱与日俱增&#xff0c;随着“萌宠经济”升温&#xff0c;越来越多的商机开始出现&#xff0c;伴随着宠物市场竞争的日益激烈&#xff0c;宠物行业的营销光靠硬广告很难吸引受众&#xf…

基于FPGA的图像二值化处理,包括tb测试文件和MATLAB辅助验证

1.算法运行效果图预览 将FPGA的数据导入到matlab进行显示 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps ............................................................................. module test_image;reg i_clk; reg i_rst; r…

使用亚马逊云科技人工智能内容审核服务,打造安全的图像生成和扩散模型

生成式人工智能技术发展日新月异&#xff0c;现在已经能够根据文本输入生成文本和图像。Stable Diffusion 是一种文本转图像模型&#xff0c;可让您创建栩栩如生的图像应用。您可以通过 Amazon SageMaker JumpStart&#xff0c;使用 Stable Diffusion 模型轻松地从文本生成图像…

轻松搭建本地知识库的ChatGLM2-6B

近期发现了一个项目&#xff0c;它的前身是ChatGLM&#xff0c;在我之前的博客中有关于ChatGLM的部署过程&#xff0c;本项目在前者基础上进行了优化&#xff0c;可以基于当前主流的LLM模型和庞大的知识库&#xff0c;实现本地部署自己的ChatGPT&#xff0c;并可结合自己的知识…

GC 算法与种类

对于垃圾收集&#xff08;GC&#xff09;, 我们需要考虑三件事情&#xff1a;哪些内存需要回收&#xff1f;如何判断是垃圾对象&#xff1f;垃圾回收算法有哪些&#xff1f; 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的&…

yolov8 模型部署--TensorRT部署-c++服务化部署

写目录 yolov8 模型部署--TensorRT部署1、模型导出为onnx格式2、模型onnx格式转engine 部署 yolov8 模型部署–TensorRT部署 1、模型导出为onnx格式 如果要用TensorRT部署YOLOv8&#xff0c;需要先使用下面的命令将模型导出为onnx格式&#xff1a; yolo export modelyolov8n.p…

FPGA时序分析与约束(2)——时序电路时序

一、前言 在之前的内容中&#xff0c;我们介绍了组合电路的时序问题和可能导致的毛刺&#xff0c;强烈推荐在阅读前文的基础上再继续阅读本文&#xff0c; 前文链接&#xff1a;FPGA时序分析与约束&#xff08;1&#xff09;——组合电路时序 这篇文章中&#xff0c;我们将继续…

MySQL表空间

MySQL表空间 文章目录 MySQL表空间1. MySQL中的表1.1 IOT表1.2 InnoDB逻辑存储结构2. 独立表空间2.1 段 segment2.1.1 段的概念2.1.2 段的分类2.1.2.1 叶子节点段主要结构2.1.2.2 非叶子节点段2.1.3 碎片区2.2 区2.2.1 区的概念2.2.2 区的结构2.2.2.1 XDES Entry结构2.3 页2.3.…

基于51单片机的称重电子秤proteus仿真设计

一、设计背景 随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。为了改变传统称重工具在使用上存在的问题&#xff0c;在本设计中将智能化、自动化、人性化用在了电子秤重的控制系统中。本系统主要由单片机来控制&#xff0c;测量物体重量部分使用称重传…