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_method String(32) 是 签名摘要算法。目前只支持:MD5。 auth_code String(32) 是 授权码。商家授权应用访问的凭证。 示例值: VlERCP4fZzHzqK7vnr8weOYqepkXriKL
timestamp String(19) 是 时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8。 越洋电铺API服务端允许该时间戳与当前时间最大误差为10分钟。 示例值:2017-01-01 12:00:00
sign String(32) 是 API输入参数签名结果,签名算法介绍签名算法。 示例值: A950EEDA1342BBDB83AB8C79B759BE44
nonce_str String(32) 是 随机字符串,长度要求在32位以内。建议每笔请求传入一个随机字符串 示例值: 3g3jJVfI9CWwKMr45x9SkB0gbi9kAn28
biz_content String 是 请求的业务参数组成的JSON字符串,请至请求详情页查看每个请求的具体业务参数定义。 示例值: {"sku_stocks":[{"outer_sku_id":"393992","stock_num":10},{"outer_sku_id":"393993","stock_num":12}]}
响应参数格式
名称 类型 必填 描述 示例值 code String(16) 是 响应码。请至各请求详情页查看请求有无公共返回码之外的业务返回码 0000 message String(128) 否 响应码描述 content json object 否 返回业务数据,具体内容由各个api确定 - 公共返回码
返回码 描述 0000 成功 0001 非法参数 0002 非法授权码 0003 非法请求时间 0004 验签失败 0005 非法api名称 0006 业务请求参数JSON格式不正确 0007 短时间请求过多 0009 处理失败,请稍后重试 签名算法
签名生成的通用步骤如下
- 第一步,设所有发送的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL查询参数键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则
- 参数名ASCII码从小到大排序(字典序);
- 如果参数的值为空不参与签名;
- 参数名区分大小写 ;
- 请求url中的app_id和method参数也参与签名
- 请求报文体内的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 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 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 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 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; }
- 第一步,设所有发送的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL查询参数键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
- 公共返回码
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!