RestTemplate
Point
- Headers,JSON,UTF-8
- Response:StatusCode,Body
RestTemplate实现调用路由
public static String restProxy(String url, String body, HttpMethod httpMethod) {
String result = Consts.EMPTY;
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
RestTemplate restTemplate = new RestTemplate();
HttpEntity entity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, httpMethod, entity, String.class);
result = responseEntity.getBody();
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
调用postForObject
private void Send(List<LogEntity> logEntities) {
if (logEntities != null && logEntities.size() > 0) {
System.out.println("logEntities" + logEntities.size());
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
var formEntity = new HttpEntity<String>(JsonUtils.serialize(logEntities), headers);
String result = restTemplate.postForObject(logConfig.getDebugUrl(), formEntity, String.class);
}
}
Spring 注入
package hello;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String args[]) {
SpringApplication.run(Application.class);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
return args -> {
Quote quote = restTemplate.getForObject(
"http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
log.info(quote.toString());
};
}
}
- RestTemplateBuilder 是通过Spring注入。
basic auth & Timeout設置
var restTemplate = restTemplateBuilder
.setConnectTimeout(mpgRestConfig.getConnectTimeout() * 1000)
.setReadTimeout(mpgRestConfig.getReadTimeout() * 1000)
.basicAuthorization(requestParameters.getUsername(), requestParameters.getPassword())
.build();
需要處理HttpClientErrorException。
Timeout 配置
通過XML配置SimpleClientHttpRequestFactory,作為構造函數注入:
<bean id="requestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="readTimeout" value="60000"/>
<property name="connectTimeout" value="10000"/>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="requestFactory"/>
<property name="messageConverters">
<list>
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes" value="application/json;charset=UTF-8" />
</bean>
</list>
</property>
</bean>
工廠方法設置:
@Configuration
public class AppConfig{
@Bean
public RestTemplate customRestTemplate(){
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(3000);
httpRequestFactory.setConnectTimeout(3000);
httpRequestFactory.setReadTimeout(3000);
return new RestTemplate(httpRequestFactory);
}
}
Builder設置:
@Bean
public RestTemplate restTemplate(
RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(500)
.setReadTimeout(500)
.build();
}