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;}

 

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

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

相关文章

机器人操作系统ROS2学习 1

随着智能化时代的进程&#xff0c;机器人也在向着高度智能化的方向发展&#xff0c;这对应的机器人操作系统也就相应而生了。机器人操作系统ROS (Robot Operating System)的诞生为机器人系统的开发与应用带来了很大方便&#xff0c;也聚集了全球大量的应用开发人员推动ROS的发展…

Debian是什么?有哪些常用命令

目录 一、Debian是什么&#xff1f; 二、Debian常用命令 三、Debian和CentOS的区别 四、Debian和CentOS的优缺点 五、Debian和CentOS的运用场景 一、Debian是什么&#xff1f; Debian是一种流行的开源Linux操作系统。 Debian是一个以Linux内核为基础的操…

【Git】Github创建远程仓库并与本地互联

创建仓库 点击生成新的仓库 创建成功后会生成一个这样的文件 拉取到本地 首先先确保本地安装了git 可以通过终端使用 git --version来查看是否安装好了git 如果显示了版本信息&#xff0c;说明已经安装好了git&#xff0c;这时候我们就可以进入我们想要clone到问目标文件夹 …

Prometheus Metrics指标类型 Histogram、Summary分析数据分布情况

​​​Histogram 直方图 、Summary 摘要 使用Histogram和Summary分析数据分布情况 除了 Counter 和 Gauge 类型的监控指标以外&#xff0c;Prometheus 还定义了 Histogram 和 Summary 的指标类型。Histogram 和 Summary 主用用于统计和分析样本的分布情况。 在大多数情况下人们…

数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析

前言 博主最近数据库原理结课要做课程设计了,要求开发基于数据库实现的图书管理系统&#xff0c;博主想了想决定做一个基于Qt的图书管理系统,博主在此之前其实也没有用过多少Qt&#xff0c;仅以此专栏记录博主学习与开发的全过程&#xff0c;大家一起学习&#xff0c;一起进步…

[leetcode] 64. 最小路径和

文章目录 题目描述解题方法动态规划java代码复杂度分析 相似题目 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#…

区块链开发用的是哪种编程语言?

区块链技术作为近年来备受瞩目的新兴技术之一&#xff0c;其核心的特性之一就是去中心化、安全性高、透明度高和可扩展性强。而区块链的开发语言则是实现这一技术的关键因素之一。那么&#xff0c;区块链开发语言是哪一种编程语言呢&#xff1f; 一、区块链开发语言的特点和选…

Whisper、Voice Engine推出后,训练语音大模型的高质量数据去哪里找?

近期&#xff0c;OpenAI 在语音领域又带给我们惊喜&#xff0c;通过文本输入以及一段 15 秒的音频示例&#xff0c;可以生成既自然又与原声极为接近的语音。值得注意的是&#xff0c;即使是小模型&#xff0c;只需一个 15 秒的样本&#xff0c;也能创造出富有情感且逼真的声音。…

.[[MyFile@waifu.club]].svh勒索病毒数据库恢复方案

.[[MyFilewaifu.club]].svh勒索病毒有什么特点&#xff1f; .[[MyFilewaifu.club]].svh是一种最近多发的勒索病毒&#xff0c;它通过加密受害者的文件并要求支付赎金来解锁&#xff0c;从而达到勒索钱财的目的。恢复重要数据请添加技术服务号(safe130)。以下是关于这种病毒的详…

同创优配正规股票港股市场炒股加仓!中国资产,火了

查查配近日,受国内利好政策不断、全球资金对中国市场信心提升等多重因素影响,市场风险偏好明显上升,A股、港股市场均表现强劲,上证指数站上3100点,恒生指数也上演九连阳,创下2018年以来的最长连涨纪录。从资金动向来看,机构加仓明显,北向资金持续净买入,A股ETF也被大幅加仓,部分…

分割出三个面的点云数据或者四个面的矩形点云数据分割 附python代码

目的:把下图的三维空间的墙壁点云分割开,最后的效果如下图 思路:先把点云转成二维的点云,然后找到四个角的点的位置,然后根据4个点的之间两两连成的线段,来判断每个点和每条线段之间的距离,从而得到每个点处于哪个线段上,这样就最终得到了三个面或四个面的三维点云的分…

武汉星起航:助力客户在亚马逊平台顺利入驻,实现跨境电商新飞跃

在全球化浪潮的推动下&#xff0c;跨境电商行业迎来了前所未有的发展机遇。作为全球电商巨头&#xff0c;亚马逊以其独特的平台属性和消费群体较高的消费能力&#xff0c;吸引了众多中国卖家的目光。武汉星起航电子商务有限公司凭借其专业的运营团队和丰富的行业经验&#xff0…