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

news2024/10/7 2:30:04

本功能的实现,去不参数于这篇博客,给这位大神点赞

基于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.请求URL
   String 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");
   // 打开输出流,默认是false
   httpConn.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)
    @ResponseBody
    public ServerResponse offerBuyBack(@RequestBody OfferBuyBack offerBuyBack){
        List<F523OutputVo> f523OutputVos= null;

        // 1.请求URL
        String 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");
            // 打开输出流,默认是false
            httpConn.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.coloradmin.cn/o/1001800.html

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

相关文章

机器学习(8)---数据预处理

文章目录 一、数据预处理1.1 数据无量纲化1.2 数据归一化1.3 数据标准化1.4 处理选择 二、缺失值2.1 填补的类和参数2.2 用Pandas和Numpy进行填补 三、处理分类型特征&#xff1a;编码与哑变量3.1 编码3.2 哑变量&#xff08;独热编码&#xff09; 一、数据预处理 1.1 数据无量…

【java】【SSM框架系列】【二】SpringMVC

目录 一、SpringMVC简介 1.1 SpringMVC概述 1.2 入门案例 1.3 入门案例工作流程分析 1.4 Conrtoller加载控制与业务BEAN加载控制 1.5 PostMan 二、请求与响应 2.1 请求映射路径 2.2 请求参数 2.2.1 Get 2.2.2 Post 2.2.3 SpringMVC解决post请求中文乱码处理 2.2.4 …

有效回文字符串(Valid palindrome)

题目描述 思路分析 代码实践 java: public class Solutation1 {//定义一个方法&#xff0c;判断是否是有效数字或者字母private static boolean isValid(char c) {//如果不是字母或者数字&#xff0c;那就返回一个flase//这里调用了Character类里面的方法return Character.i…

openwrt开启SSH远程访问与开启WEB远程访问——三种方法

openwrt 开启SSH远程访问 首先&#xff0c;你的电脑用网线连接路由器LAN口是可以访问WEB页面和SSH连接的。 例如&#xff0c;电脑1连接Openwrt路由器&#xff0c;可以进行SSH连接到openwrt 路由器。但是电脑2无法远程访问Openwrt路由器网页和SSH远程连接。 本次操作固件版本…

前端面试题JS篇(5)

如何判断一个对象是空对象 1、使用 JSON 自带的stringify方法判断 let obj{}; console.log(JSON.stringify(obj)"{}"); 2、使用 ES6 新增的方法 Object.keys()来判断 Object.keys(obj).length0 如果 new 一个箭头函数的会怎么样 箭头函数是ES6中的提出来的&…

python main 函数-启动-传递参数 python 打包 exe C# 进程传参

Part1:Python main 传递参数 在Python编程中&#xff0c;我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数&#xff0c;即通过main函数传参 1.python main 函数-启动-传递参数 test.py import sysdef main():# 获取命令行参…

代码随想录算法训练营day48|打家劫舍 |198.打家劫舍|213.打家劫舍II|337.打家劫舍 III

198.打家劫舍 力扣题目链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给…

Pytorch intermediate(三) BiLSTM

Bi-directional Long Short-Term Memory&#xff0c;双向LSTM网络。 有些时候预测可能需要由前面若干输入和后面若干输入共同决定&#xff0c;这样会更加准确。因此提出了双向循环神经网络&#xff0c;网络结构如上图。 构建LSTM模型时&#xff0c;在参数中添加bidirectionalTr…

面试半个月后的一些想法

源于半个月面试经历后的一些想法&#xff0c;刚开始想的是随便写写&#xff0c;没想到居然写了这么多。 找不到目标找不到意义亦或是烦躁的时候&#xff0c;就写写文章吧&#xff0c;把那些困扰你很久的问题铺开来 花时间仔细想想&#xff0c;其实真正让我们生气懊恼&#xff0…

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

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

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

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

我们这一代人的机会是什么?

大家好&#xff0c;我是苍何&#xff0c;今天作为专业嘉宾参观了 2023 年中国国际智能产业博览会&#xff08;智博会&#xff09;&#xff0c;是一场以「智汇八方&#xff0c;博采众长」为主题的汇聚全球智能技术和产业创新的盛会&#xff0c;感触颇深&#xff0c;随着中国商业…

在Linux(Centos7)上编译whisper.cpp的详细教程

whisper.cpp的简单介绍&#xff1a; Whisper 是 OpenAI 推出的一个自动语音识别&#xff08;ASR&#xff09;系统&#xff0c;whisper.cpp 则是 Whisper 模型的 C/C 移植。whisper.cpp 具有无依赖项、内存使用量低等特点&#xff0c;支持 Mac、Windows、Linux、iOS 和 Android …

免费开源音乐聚合软件-洛雪音乐助手

一、软件介绍 洛雪音乐助手&#xff08;LX Music&#xff09;&#xff0c;一个基于 Electron Vue 开发的免费开源音乐聚合软件&#xff0c;软件聚合多个音乐平台搜索接口&#xff0c;提供音乐在线播放和下载&#xff0c;而且免费无广告&#xff0c;支持在Windows、Mac OS、L…

CSP 202109-1 数值推导

答题 一眼看上去好像有点复杂&#xff0c;稍微想一下就知道&#xff0c;最大值就是把所有B加起来&#xff0c;最小值就是把不重复的B加起来&#xff0c;用set搞定不重复的元素 #include<iostream> #include<set> using namespace std; int main(){int n,max0,min0…

ARM接口编程—Interrupt(exynos 4412平台)

CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中断信号…

SOC 2.0安全运营中心

SOC&#xff0c;安全运营中心&#xff0c;为取得其最佳效果&#xff0c;以及真正最小化网络风险&#xff0c;需要全员就位&#xff0c;让安全成为每个人的责任。 早在几年前&#xff0c;企业就开始创建SOC来集中化威胁与漏洞的监视和响应。第一代SOC的目标&#xff0c;是集中管…

【使用Cpolar和Qchan搭建自己的个人图床】

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

TSMC逻辑制程技术命名和发展

参考来源&#xff1a; 逻辑制程 - 台湾积体电路制造股份有限公司 (tsmc.com) 1、 TSMC逻辑制程发展路线图 2、从65nm到3nm制程技术发展的简介 2.1 65nm 制程 Y2005&#xff1a;成功试产65nm晶片&#xff1b; Y2006&#xff1a;成功通过65nm制程技术的产品验证&#xff0c;推…

asio中的锁

asio到底有没有锁 asio是有锁的&#xff0c;所以规避锁的写法还是值得研究的 windows中的锁 先来张截图&#xff1a; dispatch_mutex_主要是为了保护定时器队列和完成端口回调的队列。 保护定时器队列 保护完成端口回调的队列 在PostQueuedCompletionStatus失败时&#x…