企微获客链接 中文乱码问题处理

news/2024/9/19 0:50:04/ 标签: 企业微信, 数据库, android

企微获客链接 中文乱码问题处理

  • 问题背景
  • 问题处理
  • 补充内容

问题背景

为了推广产品,同时更好的服务客户,公司在接入企业微信后,需要用到企微获客链接相关推广操作,那么通过API 接口创建企微获客链接时,出现了中文乱码问题,比如

{"errcode":0,"errmsg":"ok","link":{"link_id":"ca8e631dfgsdg3858","link_name":"??????","url":"https://work.weixin.qq.com/ca/ca8e631dfgsdg3858","create_time":1717569991}}

而实际在通过 API 接口创建企微获客链接传入的 获客链接名称 link_name : “测试获客链接”
在这里插入图片描述
那么对于这样的问题如何处理呢?

问题处理

对于这种中文乱码的问题,一般来说通常可以通过设置请求头内容类型的方式来解决,那么首先查阅一下企业微信创建企微获客链接的 API 接口文档:https://developer.work.weixin.qq.com/document/path/97297#%E5%88%9B%E5%BB%BA%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5
在这里插入图片描述
接口文档中关于链接名称 link_name 并没有特殊的说明,那么我们只能基于以往经验通过设置请求头来进行尝试,为创建企微获客链接 的代码增加请求头信息

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);

在这里插入图片描述
再次创建企微获客链接 可以看到正确返回了 中文名称的 企微获客链接

{"errcode":0,"errmsg":"ok","link":{"link_id":"cawcde5dbdafdfdaf98baf","link_name":"测试获客链接","url":"https://work.weixin.qq.com/ca/cawcde5dbdafdfdaf98baf","create_time":1717571008}}

那么到这里关于企微创建获客链接时 link_name 中文乱码的情况就解决了 。

补充内容

这里为了方便大家测试企微获客链接的 API 接口,我补充一下测试类相关代码,这样大家可以节省开发时间,测试类代码 WeChatTest.java

package com.ruoyi.web.controller.common;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import org.junit.Test;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;import java.util.*;/*** @Description com.dongao.test* @Author P001* @Date 2022/11/1 14:38* @Version 1.0*/
public class WeChatTest {private String accessToken;//企业微信的 企业idprivate final String wechatAppId = "你的企业id";//企业微信自建应用的 Secretprivate final String wechatSecret = "你的企业自建应用的Secret";/*** 获取accesstocken-自建应用 权限较小* @return*/public void getAccessToken () {String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+ wechatAppId+"&corpsecret="+wechatSecret;ResponseEntity<String> get = RestUtils.get(url, String.class);if (Objects.nonNull(get)) {String body = get.getBody();WeChatGettokenResponse res = JSON.parseObject(body, WeChatGettokenResponse.class);accessToken = res.getAccessToken();}}//创建企微获客链接   https://developer.work.weixin.qq.com/document/path/97297@Testpublic void createLink() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {//组装参数JSONObject json = new JSONObject();json.put("link_name","测试获客链接");JSONObject range = new JSONObject();List<String> list = new ArrayList<String>();list.add("AoLiNa");range.put("user_list",list);json.put("range",range);json.put("skip_verify",false);String param = JSON.toJSONString(json);HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/create_link?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,httpHeaders,param,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}//编辑企微获客链接   https://developer.work.weixin.qq.com/document/path/97297@Testpublic void updateLink() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {//组装参数JSONObject json = new JSONObject();json.put("link_id","cawcde8e631eae3858");json.put("link_name","test2024");String param = JSON.toJSONString(json);HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/update_link?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,httpHeaders,param,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}//获取企微获客链接   https://developer.work.weixin.qq.com/document/path/97297@Testpublic void getLinkList() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {//组装参数JSONObject json = new JSONObject();/*json.put("limit",100);json.put("cursor","");*/String param = JSON.toJSONString(json);String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/list_link?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,param,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}//获取企微获客链接详情   https://developer.work.weixin.qq.com/document/path/97297@Testpublic void getLinkDetailList() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {//组装参数JSONObject json = new JSONObject();json.put("link_id","cawcde5db087898baf");String param = JSON.toJSONString(json);String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/get?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,param,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}//删除企微获客链接@Testpublic void deleteLink() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {//组装参数JSONObject json = new JSONObject();json.put("link_id","cawcde5db087898baf");String param = JSON.toJSONString(json);String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/delete_link?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,param,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}//查询企微获客链接 剩余使用量@Testpublic void customerAcquisitionQuota() {//获取accesstokenif (StringUtils.isEmpty(accessToken)) {getAccessToken();}if (StringUtils.isNotEmpty(accessToken)) {String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition_quota?access_token="+accessToken;ResponseEntity<String> post = RestUtils.post(url,String.class);if (Objects.nonNull(post)) {String body = post.getBody();System.out.println(body);}}}
}

这里需要用到一个接收企业微信 access_token 的实体类,WeChatGettokenResponse.java 用于接收获取到的 企业微信 access_token ,

package com.ruoyi.web.controller.common;import com.taobao.api.internal.mapping.ApiField;/*** @Description com.dongao.project.common.wechat* @Author P001* @Date 2022/10/27 17:20* @Version 1.0*/
public class WeChatGettokenResponse extends WeChatResponse {private static final long serialVersionUID = 9059923845826321694L;@ApiField("access_token")private String accessToken;@ApiField("expires_in")private Long expiresIn;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public Long getExpiresIn() {return expiresIn;}public void setExpiresIn(Long expiresIn) {this.expiresIn = expiresIn;}
}

其中需要用到实体类 WeChatResponse.java ,该实体类主要是接收企业微信请求返回的 code 码 以及 msg 信息等

package com.ruoyi.web.controller.common;import com.taobao.api.internal.mapping.ApiField;import java.io.Serializable;/*** @Description com.dongao.project.common.wechat.response* @Author P001* @Date 2022/11/3 13:41* @Version 1.0*/
public class WeChatResponse implements Serializable {private static final long serialVersionUID = 2109769518803249524L;@ApiField("errcode")private Long errcode;@ApiField("errmsg")private String errmsg;public Long getErrcode() {return errcode;}public void setErrcode(Long errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;}
}

最后补充的是在获取企业微信获客链接相关信息时,需要用到的Rest请求工具类,具体的 RestUtils.java 工具类代码如下

package com.ruoyi.web.controller.common;import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;import java.util.Collections;
import java.util.Map;
import java.util.Objects;/*** @description:  RestUtils 远程调用工具类* @date: 2019/7/19 20:45* @author: dongao*/
public class RestUtils {private static final RestTemplate TEMPLATE = new RestTemplate();private static final int CONNECT_TIMEOUT = 10 * 1000;private static final int READ_TIMEOUT = 10 * 1000;/*** 记录请求日志*/static {// BufferingClientHttpRequestFactory因为我们要在拦截器和初始调用代码中都使用响应主体,所以这是必需的。默认实现只允许读取一次响应主体。 默认该流不可重复读SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();// 2022-03-10 设置统一超时时间requestFactory.setConnectTimeout(CONNECT_TIMEOUT);requestFactory.setReadTimeout(READ_TIMEOUT);TEMPLATE.setRequestFactory(new BufferingClientHttpRequestFactory(requestFactory));}// ----------------------------------GET-------------------------------------------------------/*** GET请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, Class<T> responseType) {return TEMPLATE.getForEntity(url, responseType);}/*** GET请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, Class<T> responseType, Object... uriVariables) {return TEMPLATE.getForEntity(url, responseType, uriVariables);}/*** GET请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.getForEntity(url, responseType, uriVariables);}/*** 带请求头的GET请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return get(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的GET请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) {HttpEntity<?> requestEntity = new HttpEntity<>(headers);return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);}/*** 带请求头的GET请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return get(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的GET请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<?> requestEntity = new HttpEntity<>(headers);return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);}/*** 自定义泛型返回GET请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, ParameterizedTypeReference<T> responseBodyType) {return exchange(url, HttpMethod.GET, HttpEntity.EMPTY, responseBodyType);}/*** 自定义泛型返回GET请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, ParameterizedTypeReference<T> responseBodyType, Object... uriVariables) {HttpHeaders headers = new HttpHeaders();//设置请求格式headers.setContentType(MediaType.APPLICATION_JSON_UTF8);//设置响应格式HttpEntity entity = new HttpEntity(headers);return exchange(url, HttpMethod.GET, entity, responseBodyType, uriVariables);}/*** 自定义泛型返回GET请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> get(String url, ParameterizedTypeReference<T> responseBodyType,  Map<String, ?> uriVariables) {return exchange(url, HttpMethod.GET, HttpEntity.EMPTY, responseBodyType, uriVariables);}/*** get queryString** @param url* @param formData* @param responseType* @param <T>* @return*/public static <T> ResponseEntity<T> getQueryString(String url, Map<String, ?> formData, Class<T> responseType) {StringBuilder queryString = new StringBuilder();for (Map.Entry<String, ?> entry : formData.entrySet()) {queryString.append("&").append(entry.getKey()).append("=");Object value = entry.getValue();if ( Objects.nonNull(value) ) {queryString.append(value);}}if ( queryString.length() > 0 ) {url = url.concat("?").concat(queryString.substring(1));}return get(url, responseType);}// ----------------------------------POST-------------------------------------------------------/*** POST请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @return*/public static <T> ResponseEntity<T> post(String url, Class<T> responseType) {return TEMPLATE.postForEntity(url, HttpEntity.EMPTY, responseType);}/*** POST请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType) {return TEMPLATE.postForEntity(url, requestBody, responseType);}/*** POST请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {return TEMPLATE.postForEntity(url, requestBody, responseType, uriVariables);}/*** POST请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.postForEntity(url, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return post(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return post(url, requestEntity, responseType, uriVariables);}/*** 带请求头的POST请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return post(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的POST请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return post(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的POST请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return TEMPLATE.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的POST请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);}/*** 自定义泛型返回POST请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, ParameterizedTypeReference<T> responseBodyType) {return exchange(url, HttpMethod.POST, null, responseBodyType);}/*** 自定义泛型返回POST请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, ParameterizedTypeReference<T> responseBodyType, Object... uriVariables) {return exchange(url, HttpMethod.POST, null, responseBodyType, uriVariables);}/*** 自定义泛型返回POST请求调用方式** @param url 请求URL* @param responseBodyType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> post(String url, ParameterizedTypeReference<T> responseBodyType,  Map<String, ?> uriVariables) {return exchange(url, HttpMethod.POST, null, responseBodyType, uriVariables);}/*** post form-data** @param url* @param formData* @param responseType* @param <T>* @return*/public static <T> ResponseEntity<T> postFormData(String url, Map<String, String> formData, Class<T> responseType) {MultiValueMap<String,String> multiFormMap = new LinkedMultiValueMap<>();for (Map.Entry<String, String> entry : formData.entrySet()) {multiFormMap.put(entry.getKey(), Collections.singletonList(entry.getValue()));}HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(multiFormMap, headers);return post(url, httpEntity, responseType);}// ----------------------------------PUT-------------------------------------------------------/*** PUT请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, Class<T> responseType, Object... uriVariables) {return put(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** PUT请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return put(url, requestEntity, responseType, uriVariables);}/*** PUT请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return put(url, requestEntity, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return put(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return put(url, requestEntity, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return put(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的PUT请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return put(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的PUT请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return TEMPLATE.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的PUT请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);}// ----------------------------------DELETE-------------------------------------------------------/*** DELETE请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Class<T> responseType, Object... uriVariables) {return delete(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** DELETE请求调用方式* * @param url 请求URL* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Class<T> responseType, Map<String, ?> uriVariables) {return delete(url, HttpEntity.EMPTY, responseType, uriVariables);}/*** DELETE请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return delete(url, requestEntity, responseType, uriVariables);}/*** DELETE请求调用方式* * @param url 请求URL* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Object... uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setAll(headers);return delete(url, httpHeaders, requestBody, responseType, uriVariables);}/*** 带请求头的DELETE请求调用方式* * @param url 请求URL* @param headers 请求头参数* @param requestBody 请求参数体* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);return delete(url, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的DELETE请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return TEMPLATE.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);}/*** 自定义请求头和请求体的DELETE请求调用方式* * @param url 请求URL* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);}// ----------------------------------通用方法-------------------------------------------------------/*** 通用调用方式* * @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,按顺序依次对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) {return TEMPLATE.exchange(url, method, requestEntity, responseType, uriVariables);}/*** 通用调用方式* * @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseType 返回对象类型* @param uriVariables URL中的变量,与Map中的key对应* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) {return TEMPLATE.exchange(url, method, requestEntity, responseType, uriVariables);}/*** 通用调用方式** @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseBodyType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseBodyType){return TEMPLATE.exchange(url, method, requestEntity, responseBodyType);}/*** 通用调用方式** @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseBodyType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseBodyType, Object... uriVariables){return TEMPLATE.exchange(url, method, requestEntity, responseBodyType, uriVariables);}/*** 通用调用方式** @param url 请求URL* @param method 请求方法类型* @param requestEntity 请求头和请求体封装对象* @param responseBodyType 返回对象类型* @return ResponseEntity 响应对象封装类*/public static <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseBodyType, Map<String, ?> uriVariables){return TEMPLATE.exchange(url, method, requestEntity, responseBodyType, uriVariables);}/*** 获取RestTemplate实例对象,可自由调用其方法* * @return RestTemplate实例对象*/public static RestTemplate getRestTemplate() {return TEMPLATE;}/*** 校验请求是否是200** @param responseEntity* @return*/public static boolean reqSuccess(ResponseEntity<?> responseEntity){return HttpStatus.OK.equals(responseEntity.getStatusCode());}/*** 校验请求是否是200** @param responseEntity* @return*/public static boolean req2xx(ResponseEntity<?> responseEntity){if ( null == responseEntity || null == responseEntity.getStatusCode() ) {return false;}return responseEntity.getStatusCode().is2xxSuccessful();}}

到这里,关于企微创建获客链接时 link_name 中文乱码的情况就处理完了。


http://www.ppmy.cn/news/1519825.html

相关文章

MYSQL————联合查询

联合多个表进行查询 设计数据时把表进行拆分&#xff0c;为了消除表中字段的依赖关系&#xff0c;比如部分函数依赖&#xff0c;传递依赖&#xff0c;这时会导致一条SQL查出来的数据&#xff0c;对于业务来说是不完整的&#xff0c;我们就可以使用联合查询把关系中的数据全部查…

Java 入门指南:Java 并发编程 —— Condition 灵活管理线程间的同步

Condition Condition 是 Java 并发编程中的一种高级同步工具&#xff0c;它可以协助线程之间进行等待和通信。提供了一种比传统的 wait() 和 notify() 更加灵活的方式来管理线程间的同步。Condition 接口通常与 Lock 接口一起使用&#xff0c;允许更细粒度的控制线程的等待和唤…

DNS服务器的配置(服务名named,端口53)

目录 前言 配置文件 DNS服务器的配置 主配置文件 扩展配置文件 区域配置文件 重启服务 配置防火墙 配置客户端dns 前言 DNS服务器的主要作用是将人类可读的域名转换为机器可读的IP地址&#xff0c;从而方便用户访问互联网资源。 在互联网中&#xff0c;设备需要通过I…

前端性能优化:使用Vue3+TS+Canvas对图片进行压缩后再上传,优化带宽,减小服务器存储成本,减少流量损耗

在上传图片之前&#xff0c;对图片进行压缩。看到这里是不是有点懵&#xff0c;前端怎么压缩图片呢&#xff0c;这不应该是后端做的吗&#xff1f; 但是我在开发的时候接到了这样一个需求&#xff0c;要求对用户上传的图片进行一定的压缩&#xff0c;而且并且尽量还原图片的清…

vue项目中scss文件导出,js文件引入scss文件时为空{}

解决办法一&#xff1a; 将scss文件重命名为 ‘原名.module.scss’ 解决办法二&#xff1a;降低vue脚手架的版本 "vue/cli-plugin-babel": "~4.5.0", "vue/cli-plugin-eslint": "~4.5.0", "vue/cli-service": "~4.5.0…

二十五、go语言的通道

目录 一、收发通信 二、将通道作为参数传递&#xff08;读、写、读写&#xff09; 三、select 1、先收到消息的先执行 2、一直没有收到消息退出通道 3、不知道何时退出情况下退出通道 go语言中的goroutine可以看成线程&#xff0c;但是又不能看成和其它语言一样的线程&am…

【Kubernetes知识点问答题】Namespace(命名空间)

目录 1. 什么是 K8s 的 namespace&#xff1f; 2. 系统默认创建了哪几个 namespace&#xff1f; 1. 什么是 K8s 的 namespace&#xff1f; 在 K8s 中&#xff0c; Namespace&#xff08;命名空间&#xff09;提供了一种机制&#xff0c;将同一集群中的资源划分为相互隔离的组…

c# net8调用vc写的dll

dll程序&#xff08;vc,x86) 头文件 extern "C" int __declspec(dllexport) WINAPI add(int a, int b);实现 int WINAPI add(int a, int b) {return a b; }c#/net8 函数声明&#xff1a; [DllImport("dll/Dll1.dll", CallingConvention CallingCo…

Git 提交代码注释信息规范

在团队协作开发过程中&#xff0c;规范的 Git 提交信息不仅能提高代码维护的效率&#xff0c;还能让其他开发者更容易理解每次提交的目的和内容。下面是常用的 Git 提交信息类型及其详细说明。此外&#xff0c;还包括一些额外的提交类型&#xff0c;以便更全面地覆盖开发过程中…

线程池相关知识点

线程池是什么相信大家都是知道的&#xff0c;所以这里就不做解释了&#xff0c;直接看相关知识点吧。 初始化线程池方法 继承ThreadPool 实现Runnable 实现Callable 接口 FutureTask &#xff08;可以拿到返回结果&#xff0c;可以处理异常&#xff09; 核心参数 corePoo…

将string类中能够实现的操作都封装在MyString类中

包括&#xff1a; 构造函数 析构函数 重载 &#xff0c;[]&#xff0c;,,,!,<,>,<,>,<<,>>; at&#xff1b; data&#xff1b; c_str; empty; length; capasityacity; clear; push_back; pop_back; append; 程序中我封装了大部分&#…

el-time-select 动态增加时间

<template><div><div v-for"(item, index) in timeSlots" :key"index"><el-time-select placeholder"起始时间" v-model"item.startTime" :picker-options"{start: 00:00,step: 00:15,end: 23:59,}"&g…

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

用实时计算释放当下企业大数据潜能

摘要&#xff1a;本文整理自阿里云高级产品解决方案架构师王启华&#xff08;敖北&#xff09;老师在 Flink Forward Asia 2023 中闭门会的分享。内容分为以下四个部分&#xff1a; 业务需求变化推动架构演进实时计算对于企业生产的意义从技术架构和技术场景来看发展和迭代客户…

使用 streamlink 把 m3u8 转为 mp4

问题描述&#xff0c; 背景&#xff0c; 来源&#xff1a; 下载 m3u8 ts —> 转为mp4, 按照以往的做法&#xff0c; 就是使用 python requests 一步一步地下载 m3u8, ts&#xff0c; 然后转换。 但是个人写的东西&#xff0c;毕竟问题比较多。 而且&#xff0c; 但是&…

2024 年的 Web3 游戏:演变、趋势和市场动态

Web3 游戏行业在经历了多年的快速发展和变革之后&#xff0c;正在2024年迎来全新的阶段。这个行业从最初的边玩边赚&#xff08;Play-to-Earn, P2E&#xff09;模式出发&#xff0c;如今正在向更为平衡的“边玩边赚”模式转型。这种转型不仅解决了早期 P2E 模式下存在的可持续性…

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到&#xff0c;在查询的时候Mapper对象已经是被代理过后的&#xff1a; 所以会执行invoke方法&#xff0c;其底层实现就是JDK的动态代理&#xff1a; 如下图所示&#xff0c;如果MethodCache里面存在方法&#xff0c;则判断这个方法是否为default方…

python实现人工神经网络

要编写一个简单的人工神经网络&#xff08;ANN&#xff09;程序&#xff0c;可以从一个基本的前馈神经网络开始&#xff0c;该网络通常包括输入层、一个或多个隐藏层以及输出层。在这个例子中&#xff0c;将使用Python的NumPy库来处理数学运算&#xff0c;并使用Sigmoid函数作为…

【Python批量下载Landsat数据】

批量下载Landsat数据&#xff08;例如Landsat 8 OLI/TIRS&#xff09;可以通过多种方法实现&#xff0c;但通常涉及使用在线服务或API接口&#xff0c;如USGS EarthExplorer、Google Earth Engine&#xff08;GEE&#xff09;或者专门的库如landsatxplore&#xff08;一个Pytho…

配置了680M和780M集显的AMD CPU列表

AMD Radeon 680M 核显配置在以下型号的 CPU 上面&#xff1a; - Ryzen 9 6980HX&#xff1a;8 核心 16 线程&#xff0c;最高加速时钟频率可达 5.0GHz&#xff0c;配备 12CU RDNA 2 架构的 Radeon 680M 核显&#xff0c;频率为 2.4GHz 。 - Ryzen 9 6900HX&#xff1a;8 核心 …