??Hello,大家好呀,我是你們的Jessica老哥,不知不覺(jué),到了3月份了,又是一年一度的金三銀四,老哥和大家一樣,想換工作,于是呢,更新資料,投簡(jiǎn)歷。試想著把自己的勞動(dòng)價(jià)值賣(mài)的更高一點(diǎn)。
??沒(méi)想到,今年好像行情有點(diǎn)不太對(duì)勁呀,往年跟HR打個(gè)招呼,人家還會(huì)要你簡(jiǎn)歷,可現(xiàn)在呢,人家是已讀不回,硬氣了。也許是老哥的學(xué)歷低,再加上大環(huán)境不好和學(xué)編程的人越來(lái)越多,不好找工作咯。算了,算了,老哥繼續(xù)茍著吧。
這次給大家?guī)?lái)的是 RestTemplate 請(qǐng)求https接口,我們都知道,https接口一般是需要證書(shū)才能訪問(wèn)的,但是我們可以采取一些特殊的手段,跳過(guò)證書(shū)驗(yàn)證。下面,老哥講下具體的代碼
1、首先,配置一個(gè) RestTemplate的bean,說(shuō)明:RestTemplate是spring-web自帶的,我們不需要額外引入什么包
@Configuration
public class RestTemplateConfig {
/**
* 構(gòu)建支持忽略自簽名證書(shū)的Restemplate的bean
* @return 支持發(fā)起https請(qǐng)求的RestTemplate對(duì)象
* @throws KeyStoreException 證書(shū)異常
* @throws NoSuchAlgorithmException 加密算法不可用異常
* @throws KeyManagementException 密鑰管理異常
*/
@Bean("httpsTemplate")
public RestTemplate createHttpsRestTemplate()
throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(
sslContext, new NoopHostnameVerifier());
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslFactory)
.build();
HttpComponentsClientHttpRequestFactory factory =
new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(3600000);
factory.setReadTimeout(3600000);
factory.setHttpClient(httpClient);
return new RestTemplate(factory);
}
}
2、然后,配置一下 RestTemplate 工具類(lèi)
@Slf4j
@Component
public class RestTemplateUtil {
private static RestTemplate restTemplate;
@Autowired
private RestTemplate httpsTemplate;
@PostConstruct
public void afterPropertiesSet() {
RestTemplateUtil.restTemplate = httpsTemplate;
}
/**
* Get 請(qǐng)求 不帶參數(shù) 沒(méi)有請(qǐng)求頭 沒(méi)有請(qǐng)求參數(shù) 沒(méi)有請(qǐng)求體
* @param url
* @return
*/
public static String sendSimple(String url) {
return sendSimple(url, null, HttpMethod.GET, null,new HttpHeaders());
}
/**
* Get 請(qǐng)求 url帶請(qǐng)求參數(shù)
* @param url
* @param urlParam
* @return
*/
public static String sendSimple(String url, Map<String, ?> urlParam) {
return sendSimple(url, urlParam, HttpMethod.GET);
}
/**
* Get 請(qǐng)求 url帶請(qǐng)求參數(shù) 請(qǐng)求頭攜帶參數(shù)
* @param url
* @param urlParam
* @param headers
* @return
*/
public static String sendSimple(String url, Map<String, ?> urlParam, HttpHeaders headers) {
return sendSimple(url, urlParam, HttpMethod.GET,null, headers);
}
public static String sendSimple(String url, Map<String, ?> urlParam, HttpMethod method) {
return sendSimple(url, urlParam, method, null,new HttpHeaders());
}
/**
* Get發(fā)送簡(jiǎn)單請(qǐng)求,不含body
*
* @param url url
* @param urlParam 用?和&拼接在url后面的參數(shù)
* @param method 請(qǐng)求方式
* @param headers 請(qǐng)求頭
* @return body
*/
public static String sendSimple(String url, Map<String, ?> urlParam, HttpMethod method, Map<String, ?> header,HttpHeaders headers) {
if (urlParam == null) {
urlParam = new HashMap<>(0);
}
// url參數(shù)拼接
url = handleUrlParam(url, urlParam);
//填充屬性到請(qǐng)求頭
fillParamsToHttpHeader(header,headers);
HttpEntity<MultiValueMap<String, ?>> requestEntity = new HttpEntity<>(null, headers);
log.info("請(qǐng)求地址為: "+url);
return restTemplate.exchange(url, method, requestEntity, String.class, urlParam).getBody();
}
/**
* 表單提交,沒(méi)有請(qǐng)求頭和url拼接,有請(qǐng)求體
* @param url
* @param body
* @return
*/
public static String sendForm(String url, Map<String, Object> body) {
return sendForm(url, null, body, HttpMethod.POST, new HttpHeaders());
}
/**
* 表單提交,有url拼接和請(qǐng)求體
* @param url
* @param body
* @return
*/
public static String sendForm(String url, Map<String, ?> urlParam, Map<String, Object> body) {
return sendForm(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
}
/**
* 表單提交,有url拼接和請(qǐng)求頭、請(qǐng)求體
* @param url
* @param urlParam
* @param header
* @param body
* @return
*/
public static String sendForm(String url, Map<String, ?> urlParam,Map<String, ?> header, Map<String, Object> body) {
return sendForm(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
}
/**
* 表單提交,有請(qǐng)求頭和請(qǐng)求體 指定請(qǐng)求方式
* @param url
* @param urlParam
* @param body
* @param method
* @return
*/
public static String sendForm(String url, Map<String, ?> urlParam, Map<String, Object> body, HttpMethod method) {
return sendForm(url, urlParam, body, method, new HttpHeaders());
}
public static String sendForm(String url,Map<String, ?> header, Map<String, Object> body,
HttpMethod method, HttpHeaders headers) {
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
return send(url, header, body, method, headers,null);
}
public static String sendForm(String url, Map<String, ?> header,Map<String, Object> body,
HttpMethod method, HttpHeaders headers, Map<String, ?> urlParam) {
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
return send(url, header,body, method, headers,urlParam);
}
public static String sendJson(String url, Map<String, Object> body) {
return sendJson(url, null, body, HttpMethod.POST, new HttpHeaders());
}
public static String sendJson(String url, Map<String, ?> urlParam, Map<String, Object> body) {
return sendJson(url, urlParam, body, HttpMethod.POST, new HttpHeaders());
}
public static String sendJson(String url, Map<String, ?> head, Map<String, Object> body, HttpMethod method,Map<String, ?> urlParam) {
return sendJson(url, head, body, method, new HttpHeaders(),urlParam);
}
public static String sendJson(String url, Map<String, ?> head, Map<String, Object> body,
HttpMethod method, HttpHeaders headers,Map<String, ?> urlParam) {
headers.setContentType(MediaType.APPLICATION_JSON);
return send(url, head, body, method, headers,urlParam);
}
/**
* 復(fù)雜請(qǐng)求發(fā)送
*
* @param url url
* @param head 請(qǐng)求頭
* @param body 請(qǐng)求體
* @param method 請(qǐng)求方式
* @param headers 實(shí)際請(qǐng)求頭
* @param urlParam 用?和&拼接在url后面的參數(shù)
*
*/
public static String send(String url, Map<String, ?> head,Map<String, Object> body, HttpMethod method,
HttpHeaders headers, Map<String, ?> urlParam) {
try {
if (urlParam == null) {
urlParam = new HashMap<>(16);
}
// Get 請(qǐng)求 url參數(shù)拼接
if (method.equals(HttpMethod.GET)){
url = handleUrlParam(url, urlParam);
}
//填充參數(shù)到Http請(qǐng)求頭
fillParamsToHttpHeader(head,headers);
log.info("請(qǐng)求地址為: "+url);
if (Objects.equals(headers.getContentType(), MediaType.APPLICATION_JSON)) {
String str=null;
if (Objects.isNull(body)){
str=new JSONObject().toJSONString();
}else {
JSONObject jsonObject = new JSONObject();
jsonObject.putAll(body);
str=jsonObject.toJSONString();
}
HttpEntity<String> requestEntity = new HttpEntity<>(str,headers);
return restTemplate.postForEntity(url,requestEntity,String.class).getBody();
}
if (Objects.equals(headers.getContentType(), MediaType.APPLICATION_FORM_URLENCODED)) {
// body參數(shù)處理
MultiValueMap<String,String> param =new LinkedMultiValueMap<>();
for (Map.Entry<String, ?> next : body.entrySet()) {
param.add(next.getKey(), (String) next.getValue());
}
HttpEntity <MultiValueMap<String,String>> requestEntity = new HttpEntity<>(param, headers);
return restTemplate.exchange(url, method, requestEntity, String.class, urlParam).getBody();
}
}catch (Exception e){
log.error(e.getMessage());
e.printStackTrace();
}
return null;
}
/**
* url參數(shù)拼接
*
* @param url
* @param urlParam
* @return
*/
private static String handleUrlParam(String url, Map<String, ?> urlParam) {
if (urlParam == null || urlParam.isEmpty()) {
return url;
}
Iterator<? extends Map.Entry<String, ?>> iterator = urlParam.entrySet().iterator();
StringBuilder urlBuilder = new StringBuilder(url);
urlBuilder.append("?");
while (iterator.hasNext()) {
Map.Entry<String, ?> entry = iterator.next();
urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
urlBuilder.deleteCharAt(urlBuilder.length() - 1);
return String.valueOf(urlBuilder);
}
/**
* 填充參數(shù)到請(qǐng)求頭
*
* @param heads
* @param headers
*/
public static void fillParamsToHttpHeader(Map<String,?> heads, HttpHeaders headers) {
if (!Objects.isNull(heads)) {
Set<String> keySet = heads.keySet();
for (String s : keySet) {
headers.add(s,String.valueOf(heads.get(s)));
}
}
}
}
3、使用,只需要按照下面的模板,傳遞參數(shù)即可文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-718759.html
public static void main(String[] args) {
//分別填入請(qǐng)求頭和請(qǐng)求體參數(shù)即可
Map<String, Object> headerMap = new ConcurrentHashMap<>(16);
Map<String, Object> bodyMap = new ConcurrentHashMap<>(16);
String url = String.format("https://%s/test", "你的主機(jī)地址");
String jsonStr = RestTemplateUtil.sendForm(url, headerMap, bodyMap);
User user = JSONObject.parseObject(jsonStr, User.class);
System.out.println(user);
}
3A、最后,各位小伙伴,麻煩給老哥一個(gè)點(diǎn)贊、關(guān)注、收藏三連好嗎,你的支持是老哥更新最大的動(dòng)力,謝謝!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-718759.html
到了這里,關(guān)于RestTemplate 請(qǐng)求https接口,無(wú)需證書(shū)訪問(wèn),并整合工具類(lèi),細(xì)到極致的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!