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

news2024/10/6 8:40:38

一、前言

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.coloradmin.cn/o/1646359.html

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

相关文章

Vue中Element的下载

打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…

Python 机器学习 基础 之 构建第一个机器学习应用

Python 机器学习 基础 之 构建第一个机器学习应用 目录 Python 机器学习 基础 之 构建第一个机器学习应用 一、简单介绍 二、第一个机器学习测试应用介绍&#xff1a;鸢尾花分类 三、第一个机器学习测试应用 &#xff1a;前置环境&#xff0c;知识点介绍 jupyter notebo…

数据结构十一:数组相关经典面试题

本篇博客详细介绍分析数组/顺序表常见的面试题&#xff0c;对于前面所学知识进行一个巩固&#xff0c;同时介绍一些力扣刷题中的一些概念&#xff1a;如&#xff1a;输出型参数等&#xff0c;在刷题中培养自己的编程思维&#xff0c;掌握常见的编程套路&#xff0c;形成题感&am…

安卓应用开发(一):工具与环境

开发工具 Android Studio&#xff0c;用于开发 Android 应用的官方集成开发环境 (IDE)。包括以下功能&#xff1a; 基于Gradle的构建系统 gradle是一个项目构建工具&#xff0c;将源工程打包构建为apk 安卓模拟器统一环境代码编辑模拟器实时更新Github集成Lint功能&#xff0…

fabric部署调用合约示例

一 打包智能合约 ①进入fabric-samples文件夹下的chaincode/fabcar/go目录下执行 GO111MODULEon go mod vendor下载依赖&#xff08;文件夹下已经有go.mod&#xff0c;不需要使用go mod init生成该module文件&#xff09;②进入到test-network文件下使用以下命令将二进制文件…

DRF的序列化【2】

【0】前提概要 【1】基于 View JsonResponse 编写的 5 个接口&#xff1a; 序列化自定义处理: 你需要自己编写序列化逻辑。处理 JSON 格式的 POST 请求数据: 从 request.body 中获取数据&#xff0c;并使用 json.loads() 解析成字典&#xff0c;然后创建相应的对象。request.…

Vue入门到关门之Vue3项目创建

一、vue3介绍 1、为什么要学习vue3&#xff1f; vue3的变化&#xff1a; 首先vue3完全兼容vue2&#xff0c;但是vue3不建议用vue2的写法&#xff1b;其次&#xff0c;vue3拥抱TypeScript&#xff0c;之前vue2使用的JavaScript&#xff0c;ts完全兼容js 最后之前学的vue2 是…

JavaScript 中的 Class 类

&#x1f525; 引言 在ECMAScript 2015&#xff08;ES6&#xff09;中&#xff0c;class 关键字被引入&#xff0c;为JavaScript带来了一种更接近传统面向对象语言的语法糖。类是创建对象的模板&#xff0c;它们封装了数据&#xff08;属性&#xff09;和行为&#xff08;方法&…

25.哀家要长脑子了---哈希表

1.525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 在我对通义千问的一番折磨下&#xff0c;终于弄清楚一点点了。哈希表存储前缀和数组值 用一个counter来记录nums中0、1数量差值的变化。 哈希表map存储某个特定的counter值首次出现的位置。counter的计算&#xff1a;…

2023年乡镇街道边界数据、行政村边界、省市县区划边界、建筑轮廓边界数据、流域边界数据、降雨量分布、气温分布、道路网分布

数据范围&#xff1a;全国行政区划-行政乡镇街道边界 数据类型&#xff1a;面状数据&#xff0c;全国各省市县【乡镇-边界】乡村界、乡村范围 数据属性&#xff1a;标准12位行政区划编码、乡镇名称、所属地区 分辨率&#xff1a;1:2万--1:5万 数据格式&#xff1a;SHP数据&…

力扣100284. 有效单词(C++)

【题解】 (实际在力扣中运行的代码只需要把下方的check函数放到力扣作答区给的模板中就可以) #include <bits/stdc.h> #include <iostream> #include <vector> #include <string> #include <cctype> #include <cstring> #include <st…

【简单介绍下Debian常用命令】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

tomcat-以服务的方式重启tomcat

背景 双击tomcat的bin目录下面的startup.bat&#xff0c;会留下一个cmd的窗口&#xff0c;很不优雅 使用service服务的方式启动&#xff0c;并且设置为自动启动 找到tomcat的bin目录输入cmd&#xff0c;按Enter&#xff0c;进入命令行界面。执行“service.bat install” 。&…

最近惊爆谷歌裁员

Python团队还没解散完&#xff0c;谷歌又对Flutter、Dart动手了。 什么原因呢&#xff0c;猜测啊。 谷歌裁员Python的具体原因可能是因为公司在进行技术栈的调整和优化。Python作为一种脚本语言&#xff0c;在某些情况下可能无法提供足够的性能或者扩展性&#xff0c;尤其是在…

【小菜鸟之---Ansible基础详解】

文章目录 1 【Ansible简介】1.1简介1.2 Ansible 特点1.3 Ansible的工作机制1.4Ansible任务工作模式 2【安装部署】2.1安装命令2.2 Ansible配置文件2.3主机清单配置2.4 基于ssh免密登录2.5常用命令 3【Ansible常用模块】3.1 ping模块3.2 shell模块3.3 command模块3.4 copy模块3.…

【notes2】并发,IO,内存

文章目录 1.线程/协程/异步&#xff1a;并发对应硬件资源是cpu&#xff0c;线程是操作系统如何利用cpu资源的一种抽象2.并发&#xff1a;cpu&#xff0c;线程2.1 可见性&#xff1a;volatile2.2 原子性&#xff08;读写原子&#xff09;&#xff1a;AtomicInteger/synchronized…

【从零开始学架构 前言】整体的学习路线

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;在工作6年左右的这个时间点需要有一些先行的理论来指导即将面临的复杂实践&#xff0c;以便在真正面临复杂实践的时候能有所参照。 主要从以下几个方面和顺序来进行学习 架构基础&#xff1a;从架构设计的本质、历史背景…

# 怎么关闭 win10 系统中自带的【文件预览】功能?关闭WIN10【文件预览】功能的方法

怎么关闭 win10 系统中自带的【文件预览】功能&#xff1f;关闭WIN10【文件预览】功能的方法 win10 系统中自带的【文件预览】功能&#xff0c;默认是开启状态的&#xff0c;如果需要关闭它&#xff0c;一步搞定。 1、打开电脑文件浏览器&#xff0c;随便进入有文件的一个文件…

【Linux】操作系统

上一篇博客我们从硬件的角度谈了计算机&#xff0c;我们说到了计算机的效率跟操作系统写的好不好有着直接的关系&#xff0c;那么这篇博客我们从软件的角度&#xff0c;就来谈一谈究竟什么是操作系统&#xff0c;为什么要有操作系统&#xff1f; 首先我们来大体的认识一下操作…

php基础知识快速入门

一、PHP基本知识 1、php介绍&#xff1a; php是一种创建动态交互性的强有力的服务器脚本语言&#xff0c;PHP是开源免费的&#xff0c;并且使用广泛。PHP是解释性语言&#xff0c;按顺序从上往下执行&#xff0c;无需编译&#xff0c;直接运行。PHP脚本在服务器上运行。 2、ph…