springboot 使用RestTemplate调用get api,传入参数

发布时间 2023-08-30 13:43:06作者: 苹果芒

get api:

    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    @GetMapping(value = "/checkGetApi")
    @ApiOperation(value = "check get api method")
    public JSONObject checkGetApi(Integer userName) {
        JSONObject result = new JSONObject();
        try {
                String url= "http://xxx.com";
                Map<String, String> parameterMap = new HashMap<>();
                parameterMap.put("userName", userName);//设置 UserName
                JSONObject response= requestApi.getApi(url, parameterMap);
                return response;
            
        } catch (Exception e) {
            logger.info("Invoke eapi failed!");
            result.put("msg", "Invoke api failed!"); 
result.put(
"status", false);
       return result;
}
}

Servers:

 

@Service
public class RequestApi {
    private org.slf4j.Logger logger = LoggerFactory.getLogger(RequestApi.class);

    //    private RestTemplate restTemplate = new RestTemplate();//RestTemplate默认不处理HTTP响应码为400、500这类响应结果,直接抛异常
    //注入restTemplate bean
    @Resource(name = "myRestTemplate")
    private RestTemplate restTemplate;

    public JSONObject getApi(String url, Map<String, String> parameters) {
        try {
            logger.info("Start to get coverage api,url is {} , Parameters is {}", url, parameters.toString());
            //Set url, restTemplate请求的url后面要有占位符
//        url=url+"?";
            StringBuffer sb = new StringBuffer(url);
            sb = sb.append("?");
//        sb=sb.append("?Prameter1={pam1}&Name={Name}&Type={Type}");//get请求得参数,需要先占位 才能请求成功
            for (String key : parameters.keySet()) {
                sb.append(key + "={" + key + "}&");
            }
            sb = new StringBuffer(sb.substring(0, sb.lastIndexOf("&"))); //去掉最后的&符号
            String response = restTemplate.getForObject(sb.toString(),//获取资源的地址,get请求
                    String.class,//返回类型设为String
                    parameters
            );
            JSONObject body = JSONObject.parseObject(response);//获取respons
            Integer code = body.getInteger("code");
            String msg = body.getString("msg");
            logger.info("Invoke api failed,response code is {},msg is {}", code, msg);
            return body;
        } catch (Exception e) {
            logger.error("Invoke  apifailed!exception is {}",e);
            return null;
        }

    }
}

如何设置自动化的restTempalet:

package com.control.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.ResponseErrorHandler;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

//RestTemplate默认不处理HTTP响应码为400、500这类响应结果,直接抛异常,但是,该请求的响应结果内容却是我需要用到的,
// 所以解决办法是:需要重写ResponseErrorHandler ,,对响应的错误信息不进行处理
@Configuration
public class FacePlusThrowErrorHandler implements ResponseErrorHandler {

    //写ResponseErrorHandler
    @Override
    public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
        return false;
    }

    //写ResponseErrorHandler
    @Override
    public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {

    }

    //设置自定义restTemplate
    /**
     * 常用远程调用RestTemplate
     * @return restTemplate
     **/
    @Bean
    public RestTemplate myRestTemplate() {
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setConnectTimeout(300000);
        requestFactory.setReadTimeout(300000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
        restTemplate.setErrorHandler(new FacePlusThrowErrorHandler());
        return restTemplate;
    }

//    @Bean("restTemplate")
//    public RestTemplate restTemplate(){
//        RestTemplate restTemplate = new RestTemplate();
//        restTemplate.setErrorHandler(new AcceptResponseErrorHandler());
//        return restTemplate ;

}