【Java】发送post/get请求,调用第三方接口工具分享

分享工具类(可直接复制粘贴)

package com.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Configuration
public class RestTemplateUtils {

    private static final int DEFAULT_TIMEOUT = 5000;

    private static RestTemplate instanceRestTemplate;

    @Bean("restTemplate")
    public RestTemplate restTemplate() {
        instanceRestTemplate = getInstance();
        return instanceRestTemplate;
    }

    public static RestTemplate getInstance() {
        return getRestTemplateByTimeout(DEFAULT_TIMEOUT);
    }

    public static RestTemplate getRestTemplateByTimeout(int timeout) {
        return getRestTemplateByTimeout(timeout, timeout);
    }

    public static RestTemplate getRestTemplateByTimeout(int connectTimeout, int readTimeout) {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(connectTimeout);
        httpRequestFactory.setConnectTimeout(connectTimeout);
        httpRequestFactory.setReadTimeout(readTimeout);
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);

        List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
        httpMessageConverters.forEach(httpMessageConverter -> {
            if (httpMessageConverter instanceof StringHttpMessageConverter) {
                StringHttpMessageConverter messageConverter = (StringHttpMessageConverter)httpMessageConverter;
                messageConverter.setDefaultCharset(StandardCharsets.UTF_8);
            }
        });

        restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new LoggingRequestInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }

    /**
     * 无参数方式post
     *
     * @param restTemplate
     * @param url
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T post(RestTemplate restTemplate, String url, Class<T> clazz) {
        return post(restTemplate, url, null, null, null, clazz);
    }

    /**
     * 只有query参数方式post
     *
     * @param restTemplate
     * @param url
     * @param queryParamMap
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T post(RestTemplate restTemplate, String url, LinkedMultiValueMap<String, String> queryParamMap, Class<T> clazz) {
        return post(restTemplate, url, null, queryParamMap, null, clazz);
    }

    /**
     * body参数方式post
     *
     * @param restTemplate
     * @param url
     * @param body
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T post(RestTemplate restTemplate, String url, Object body, Class<T> clazz) {
        return post(restTemplate, url, body, null, null, clazz);
    }

    /**
     * body header参数方式post
     *
     * @param restTemplate
     * @param url
     * @param body
     * @param httpHeaders
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T post(RestTemplate restTemplate, String url, Object body, HttpHeaders httpHeaders, Class<T> clazz) {
        return post(restTemplate, url, body, null, httpHeaders, clazz);
    }

    /**
     * 文件方式
     *
     * @param restTemplate
     * @param url
     * @param map
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T postFile(RestTemplate restTemplate, String url, LinkedMultiValueMap<String, Object> map, Class<T> clazz) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        return postFile(restTemplate, url, map, headers, clazz);
    }

    /**
     * 可带query参数
     *
     * @param restTemplate
     * @param url
     * @param body
     * @param queryParamMap query参数
     * @param headers
     * @param clazz
     * @param <T>
     * @return
     * @param <E>
     */
    public static <T, E> T post(RestTemplate restTemplate, String url, E body, LinkedMultiValueMap<String, String> queryParamMap, HttpHeaders headers, Class<T> clazz) {
        String requestUrl = url;
        if (MapUtils.isNotEmpty(queryParamMap)) {
            requestUrl = UriComponentsBuilder.fromUriString(url).queryParams(queryParamMap).build().encode(StandardCharsets.UTF_8).toUriString();
        }
        if (null == headers) {
            headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        }
        HttpEntity<E> entity = new HttpEntity<>(body, headers);
        ResponseEntity<T> exchange = exchangePost(restTemplate, requestUrl, entity, clazz);
        return exchange.getBody();
    }

    /**
     * 文件方式FileSystemResource
     *
     * @param restTemplate
     * @param url
     * @param map
     * @param headers
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T postFile(RestTemplate restTemplate, String url, LinkedMultiValueMap<String, Object> map, HttpHeaders headers, Class<T> clazz) {
        if (null == headers) {
            headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        }
        HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<>(map, headers);
        ResponseEntity<T> exchange = exchangePost(restTemplate, url, entity, clazz);
        return exchange.getBody();
    }

    private static <E, T> ResponseEntity<T> exchangePost(RestTemplate restTemplate, String requestUrl, HttpEntity<E> entity, Class<T> targetClazz) {
        RestTemplate restTemplate$;
        if (null == restTemplate) {
            restTemplate$ = instanceRestTemplate;
        } else {
            restTemplate$ = restTemplate;
        }
        return restTemplate$.exchange(requestUrl, HttpMethod.POST, entity, targetClazz);
    }

}


继续添加:RestTemplateResponseErrorHandler,LoggingRequestInterceptor:
@Slf4j
public class RestTemplateResponseErrorHandler extends DefaultResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return false;
    }

}

第二个:

@Slf4j
public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        traceRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        traceResponse(response);
        return response;
    }

    private void traceRequest(HttpRequest request, byte[] body) {
        if (log.isDebugEnabled()) {
            log.debug("===========================request begin================================================");
            log.debug("URI         : {}", request.getURI());
            log.debug("Method      : {}", request.getMethod());
            log.debug("Headers     : {}", request.getHeaders());
            log.debug("Request body: {}", new String(body, StandardCharsets.UTF_8));
            log.debug("==========================request end================================================");
        }
    }

    private void traceResponse(ClientHttpResponse response) throws IOException {
        if (log.isDebugEnabled()) {
            StringBuilder inputStringBuilder = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), StandardCharsets.UTF_8));
            String line = bufferedReader.readLine();
            while (line != null) {
                inputStringBuilder.append(line);
                inputStringBuilder.append('\n');
                line = bufferedReader.readLine();
            }
            log.debug("============================response begin==========================================");
            log.debug("Status code  : {}", response.getStatusCode());
            log.debug("Status text  : {}", response.getStatusText());
            log.debug("Headers      : {}", response.getHeaders());
            log.debug("Response body: {}", inputStringBuilder);
            log.debug("=======================response end=================================================");
        }

    }

}

使用示例,包含query/body的参数形式

post示例

get示例

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用HttpURLConnection或者HttpClient等类库来实现调用第三方API的GET和POST请求GET请求示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class GetRequestExample { public static void main(String[] args) { try { URL url = new URL("https://api.example.com/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "application/json"); if (conn.getResponseCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); String output; System.out.println("Output from Server .... \n"); while ((output = br.readLine()) != null) { System.out.println(output); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` POST请求示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.io.OutputStream; import java.nio.charset.StandardCharsets; public class PostRequestExample { public static void main(String[] args) { try { URL url = new URL("https://api.example.com/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Accept", "application/json"); conn.setDoOutput(true); String requestBody = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; try (OutputStream os = conn.getOutputStream()) { byte[] input = requestBody.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } if (conn.getResponseCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream()))); String output; System.out.println("Output from Server .... \n"); while ((output = br.readLine()) != null) { System.out.println(output); } conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这里以调用JSON格式的API接口为例,请求头中设置了Accept为"application/json",请求体中的数据也是JSON格式的。POST请求需要设置请求方法为"POST",同时需要设置请求头中的Content-Type为"application/json",并且需要将请求体数据写入到请求输出流中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值