当前位置: 首页>移动开发>正文

请求三方接口返回的结果乱码如何解决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。

特别注意以下重要规则

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

 

请求三方接口返回的结果乱码如何解决java 第三方接口请求提示,请求三方接口返回的结果乱码如何解决java 第三方接口请求提示_字符串,第1张


https://www.xamrdz.com/mobile/4fd1964548.html

相关文章: