Java请求第三方接口的一些步骤

一、前言

Java请求第三方接口的一些步骤。

在Java中请求第三方接口通常涉及以下步骤。这些步骤涵盖了从准备请求到处理响应的整个过程。

1. 确定接口详情

  • 接口URL:你要请求的URL。
  • 请求方法:如GET、POST、PUT、DELETE等。
  • 请求参数:包括URL参数、请求体参数、请求头参数等。
  • 响应格式:如JSON、XML等。

2. 添加依赖

如果你使用的是Maven或Gradle等构建工具,你可能需要添加HTTP客户端库的依赖。例如,你可以使用Apache HttpClient、OkHttp、Retrofit等。

3. 创建请求

  • 创建一个HttpURLConnection对象(或其他HTTP客户端库的实例)。
  • 设置请求方法(如HttpURLConnection.setRequestMethod("POST"))。
  • 如果需要,设置请求头(如Content-Type、Authorization等)。
  • 如果请求有请求体(如POST请求),设置请求体的内容。

4. 发送请求并获取响应

  • 调用HTTP客户端的发送请求方法(如HttpURLConnection.connect())。
  • 读取响应状态码和响应头。
  • 读取响应体内容(如JSON字符串)。

5. 处理响应

  • 根据响应状态码判断请求是否成功。
  • 解析响应体内容(如将JSON字符串解析为Java对象)。
  • 处理异常或错误情况。

二、获取接口文档(示例)

POST请求报文体是如下请求参数组成的JSON报文
响应报文体是如下响应参数组成JSON报文

请求参数格式
名称类型必填描述
sign_methodString(32)签名摘要算法。目前只支持:MD5。
auth_codeString(32)授权码。商家授权应用访问的凭证。
示例值: VlERCP4fZzHzqK7vnr8weOYqepkXriKL
timestampString(19)时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8。 越洋电铺API服务端允许该时间戳与当前时间最大误差为10分钟。
示例值:2017-01-01 12:00:00
signString(32)API输入参数签名结果,签名算法介绍签名算法。
示例值: A950EEDA1342BBDB83AB8C79B759BE44
nonce_strString(32)随机字符串,长度要求在32位以内。建议每笔请求传入一个随机字符串
示例值: 3g3jJVfI9CWwKMr45x9SkB0gbi9kAn28
biz_contentString请求的业务参数组成的JSON字符串,请至请求详情页查看每个请求的具体业务参数定义。
示例值: {"sku_stocks":[{"outer_sku_id":"393992","stock_num":10},{"outer_sku_id":"393993","stock_num":12}]}
响应参数格式
名称类型必填描述示例值
codeString(16)响应码。请至各请求详情页查看请求有无公共返回码之外的业务返回码0000
messageString(128)响应码描述
contentjson object返回业务数据,具体内容由各个api确定
  • 公共返回码
返回码描述
0000成功
0001非法参数
0002非法授权码
0003非法请求时间
0004验签失败
0005非法api名称
0006业务请求参数JSON格式不正确
0007短时间请求过多
0009处理失败,请稍后重试
签名算法
签名生成的通用步骤如下
  • 第一步,设所有发送的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL查询参数键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则

  1. 参数名ASCII码从小到大排序(字典序);
  2. 如果参数的值为空不参与签名;
  3. 参数名区分大小写 ;
  4. 请求url中的app_id和method参数也参与签名
  5. 请求报文体内的sign参数不参与签名
例如将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1, 参数名和参数值链接后,得到拼装字符串bar=2&baz=3&=foo1
  • 第二步,在stringA最后拼接上&app_secret=${appSecret}得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

三、签名,参数

/**
	 * 
	 * 组装请求签名信息
	 * 
	 * @return
	 */
	private HashMap<String, String> getResModelSign(String biz_content) {
 
		String signMethod = "MD5";
		// 时间戳
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String timestamp = sdf.format(new sunbox.core.util.Date());

		// 随机数
		String nonceStr = Utility.randomString(6, 1);

		HashMap<String, String> bodyMap = new HashMap<>();

		bodyMap.put("app_id", appId);
		bodyMap.put("app_secret", appSecret);
		bodyMap.put("method", method);
		bodyMap.put("sign_method", signMethod);
		bodyMap.put("timestamp", timestamp);
		bodyMap.put("nonce_str", nonceStr);
		bodyMap.put("auth_code", authCode);
		bodyMap.put("biz_content", biz_content);

		String signStr = "app_id=" + appId + "&" + "auth_code=" + authCode + "&" + "biz_content=" + biz_content + "&"
				+ "method=" + method + "&" + "nonce_str=" + nonceStr + "&" + "sign_method=" + signMethod + "&"
				+ "timestamp=" + timestamp + "&" + "app_secret=" + appSecret;

		String sign = CtgSignUtil.MD5(signStr).toUpperCase();
		bodyMap.put("sign", sign);
		return bodyMap;

	}

四、开发调试

public static String doPost(String url, String content, String contentType
            , int connTimeOut, int readTimeOut, Map<String, String> reqHead) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse httpResponse = null;
        String result = "";
        // 创建httpClient实例
        httpClient = HttpClients.createDefault();
        // 创建httpPost远程连接实例
        HttpPost httpPost = new HttpPost(url);
        // 配置请求参数实例
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connTimeOut)// 设置连接主机服务超时时间
                .setConnectionRequestTimeout(connTimeOut)// 设置连接请求超时时间
                .setSocketTimeout(readTimeOut)// 设置读取数据连接超时时间
                .setProxy(httpClientProxy)
                .build();
        // 为httpPost实例设置配置
        httpPost.setConfig(requestConfig);
        // 设置请求头
        httpPost.addHeader("Content-Type", contentType);
//        httpPost.addHeader("Content-Length", String.valueOf(content.length()));
        if (reqHead != null) {
            for (Map.Entry<String, String> entry : reqHead.entrySet()) {
                if (StringUtils.isNotBlank(entry.getValue())) {
                    httpPost.addHeader(entry.getKey(), entry.getValue());
                }
            }
        }
        // 封装post请求参数
        if (null != content) {
            // 为httpPost设置封装好的请求参数
            byte[] b = content.getBytes(StandardCharsets.UTF_8);
            InputStream is = new ByteArrayInputStream(b, 0, b.length);
            httpPost.setEntity(new InputStreamEntity(is, b.length
                    , ContentType.create(contentType, StandardCharsets.UTF_8)));
        }
        try {
            // httpClient对象执行post请求,并返回响应参数对象
            httpResponse = httpClient.execute(httpPost);

            // 从响应对象中获取响应内容
            HttpEntity entity = httpResponse.getEntity();
            result = EntityUtils.toString(entity, "UTF-8");

            if (httpResponse.getStatusLine().getStatusCode() != 200) {
                throw new Exception(result);
            }
        } catch (ClientProtocolException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        } finally {
            // 关闭资源
            if (null != httpResponse) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    throw e;
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    throw e;
                }
            }
        }
        return result;
    }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git tag 相关操作

文章目录 前言一、git里面的Tag二、Tag 类型1. 轻量级标签&#xff08;Lightweight Tag&#xff09;2. 注释标签&#xff08;Annotated Tag&#xff09; 其他常用操作git taggit show <tagname>git push origin <tagname>删除tag使用 gitk 查看效果 总结 前言 一般…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

Day_1

1. 环境搭建 技术选型 后端项目结构 sky-take-out maven父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 sky-common 子模块&#xff0c;存放公共类&#xff0c;例如&#xff1a;工具类、常量类、异常类等 sky-pojo 子模块&#xff0c;存放实体类、VO、DTO…

【UE5学习笔记】编辑及运行界面:关闭眼部识别(自动曝光)

自动曝光&#xff0c;也就是走进一个黑暗的环境&#xff0c;画面会逐渐变量&#xff0c;以模拟人眼进入黑暗空间时瞳孔放大&#xff0c;进光量增加的一种真实视觉感受&#xff1a; 制作过程中是否关闭自动曝光&#xff0c;取决于游戏的性质&#xff0c;但是个人认为&#xff0c…

力扣每日一题115:不同的子序列

题目 困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit" 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种…

遥遥领先们赚钱的路子,被香飘飘找到了……?

刚刚结束了的五一长假&#xff0c;中文互联网上可以说满是各种对立、冲突。 让人惋惜的胖猫及遭万人唾弃的捞女谭竹之外&#xff0c;曾经卖奶茶杯子绕地球几圈&#xff0c;如今却被多数人遗忘的香飘飘&#xff0c;一通操作下来&#xff0c;让不少吃瓜群众小刀剌屁股开了眼了……

自动化运维工具-Ansible

一、Ansible概述 Ansible是一种基于python开发的自动化运维工具&#xff0c;它只需要在服务端安装ansible&#xff0c;无需在每个客户端安装客户端程序&#xff0c;通过ssh的方式来进行客户端服务器的管理&#xff0c;基于模块来实现批量数据配置、批量设备部署以及批量命令执…

《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用

原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后&#xff0c;我们评估了 Mamba 的时空建模能力。与之前的小节类似&#xff0c;我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…

练习题(2024/5/5)

1左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输…

【Web漏洞指南】XSS漏洞详细指南

【Web漏洞指南】XSS漏洞详细指南 概述XSS的三种类型执行任意 JS 代码的方式在原始HTML中注入绕过手法在 HTML标记内注入绕过手法在JavaScript代码中注入绕过手法其他绕过手法XSS常见有效载荷检索Cookies窃取页面内容键盘记录器查找内部IP地址端口扫描器自动填充密码捕获窃取 Po…

基于Spring Boot的大学生社团活动平台设计与实现

基于Spring Boot的大学生社团活动平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图&#xff0c;学生在大学生社团…

Android11 InputManagerService启动流程分析

InputManagerService在systemserver进程中被启动 //frameworks\base\services\java\com\android\server\SystemServer.java t.traceBegin("StartInputManagerService"); inputManager new InputManagerService(context);//1 t.traceEnd(); //省略 //注册服务 Servi…

某东抢购某台脚本-低调

某东抢购某台脚本 小白操作-学习使用 注意&#xff1a; 本文部分变量已做脱敏处理&#xff0c;仅用于测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。技术层面需要提…

尊享面试100(272.最接近的二叉树搜索值|| python)

刚开始想着用最小堆&#xff0c;把每个元素都加进去&#xff0c;然后找出最小的k个值&#xff0c;复杂度应该是&#xff08;nklogn) import heapq as pq class Solution:def __init__(self):self.h []pq.heapify(self.h)def closestKValues(self, root: Optional[TreeNode], …

WINDOWS配置IIS

1.安装IIS 1.1.打开启用Windows功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 1.2.启用IIS功能 打开“控制面板” > “程序和功能” > “启用或关闭 Windows 功能”。 勾选“Internet Information Services”&#xff0c;然后点击“确定…

《21天学通C++》(第十一章)多态

为什么需要多态&#xff1f; 为了最大限度地减少代码&#xff0c;提高可读性 1.虚函数 虚函数是C中的一种特殊成员函数&#xff0c;它允许在派生类&#xff08;也称为子类&#xff09;中重写&#xff08;覆盖&#xff09;基类的实现&#xff0c;使用virtual进行声明 在C中&am…

【GameFi】链游 | Seraph | 区块链上的动作角色扮演 NFT 装备收集和掠夺游戏

官网下载 新赛季公告&#xff1a;https://www.seraph.game/#/news/357 开始时间&#xff1a;2024年4月19日 11:00 (UTC8&#xff09; discard会有人发送一些激活码&#xff0c;或者有一些活动&#xff0c;只需要填表格关注账号&#xff0c;参与了就会将激活码发到你的邮箱 …

Remix框架实现 SSR

SSR SSR是一种网页渲染方式&#xff0c;它与传统的客户端渲染&#xff08;CSR&#xff09;相对&#xff0c;在日常的项目中我们更多是使用 CSR 的方式进行前端分离开发&#xff0c;渲染会在浏览器端进行。然而在SSR中&#xff0c;当用户请求一个网页时&#xff0c;服务器将生成…

U盘提示“被写保护”无法操作处理怎么办?

今天在使用U盘复制拷贝文件时&#xff0c;U盘出现“U盘被写保护”提示&#xff0c;导致U盘明明有空闲内存却无法复制的情况。这种情况很常见&#xff0c;很多人在插入U盘到电脑后&#xff0c;会出现"U盘被写保护"的提示&#xff0c;导致无法进行删除、保存、复制等操…

一、Redis五种常用数据类型

Redis优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…