微服务请求第三方服务实现

系统业务免不了与第三方公司进行交互,需要远程调用,RestTemplate到底是什么玩意?

RestTemplate是Spring提供的用于访问Rest服务的客户端工具,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率
弱弱呼吁一句:对于那些在Spring环境下还在使用HttpClient(或其它Client)的同学,今儿看完本文后,建议切换到RestTemplate (有特殊需求的当然除外喽~)。

RestTemplate简化了与http服务的通信,程序代码可以给它提供URL,并提取结果。它默认使用的JDK 的HttpURLConnection进行通信,然而我们是可以通过RestTemplate.setRequestFactory切换到不同的HTTP源:如Apache HttpComponentsNettyOkHttp等等。

关于响应:

xxxForObject:返回响应体(也就直接是body体力的内容) (T)
xxxForEntity:返回的相应行、响应头、响应码、响应体等等 (ResponseEntity
xxxForLocation:提交成功之后,返回新资源的URI。这个只需要服务提供者返回一个 URI 即可,该 URI 表示新资源的位置,可谓非常轻量。 (URI)

注意:使用字符串类型的url默认会对url进行转义,如http://example.com/hotel list在执行时会转义为http://example.com/hotel%20list,隐式的转义这样是没有问题的。但如果你自己已经转义过了,那就不ok了。
若不想要这种隐式的转义,建议使用URI(URI uri = uriComponents.toUri())来构造。

请求方式、载体、编码等都需要注意

public class RestTemplateUtil {

	private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtil.class);
	/**
	 * RestTemplate 工具方法
	 * @param url
	 * @param object
	 * @return
	 */
	public static String postRestTemplate(String url, Map object){
		SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
		httpRequestFactory.setReadTimeout(35000);
		httpRequestFactory.setConnectTimeout(5000);
		
		List> messageConverters = new ArrayList>();
		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
		List supportedMediaTypes = new ArrayList<>();
		supportedMediaTypes.add(MediaType.APPLICATION_JSON);
		supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
		supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
		supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
		supportedMediaTypes.add(MediaType.APPLICATION_PDF);
		supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_XML);
		supportedMediaTypes.add(MediaType.IMAGE_GIF);
		supportedMediaTypes.add(MediaType.IMAGE_JPEG);
		supportedMediaTypes.add(MediaType.IMAGE_PNG);
		supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
		supportedMediaTypes.add(MediaType.TEXT_HTML);
		supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
		supportedMediaTypes.add(MediaType.TEXT_PLAIN);
		supportedMediaTypes.add(MediaType.TEXT_XML);
		fastConverter.setSupportedMediaTypes(supportedMediaTypes);
		FastJsonConfig fastJsonConfig = new FastJsonConfig();
		fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
		fastConverter.setFastJsonConfig(fastJsonConfig);
		messageConverters.add(fastConverter);

		RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
		restTemplate.setMessageConverters(messageConverters);
		LOGGER.info("请求地址"+url);
		LOGGER.info("入参"+ JSON.toJSONString(object));
		String s = restTemplate.postForObject(url, object, String.class);
		LOGGER.info(url+"出参" + s);
		return s;
	}
	/**
	 * RestTemplate 工具方法
	 * @param url
	 * @param object
	 * @return
	 */
	public static String postRestTemplate(String url, Map object,Map headers){
		RestTemplate restTemplate = getRestTemplate();

		HttpHeaders httpHeaders = new HttpHeaders();
		if (Objects.nonNull(headers)) {
			headers.forEach((key, value) -> {
				httpHeaders.add(key, value);
			});
		}

		HttpEntity> httpEntity = new HttpEntity>(object, httpHeaders);

     	LOGGER.info("请求地址"+url+"Header"+JSON.toJSONString(object));
    	LOGGER.info("请求地址"+url);
		LOGGER.info("入参"+ JSON.toJSONString(httpEntity));
		 String s = restTemplate.postForObject(url, httpEntity,  String.class);
		LOGGER.info("出参" + s);
		return s;
	}

	/**
	 * RestTemplate 工具方法
	 * @param url
	 * @param object
	 * @return
	 */
	public static String postRestTemplate(String url, Map object,Map headers,SmpSendLogBO reqBO ){

		RestTemplate restTemplate = getRestTemplate();

		HttpHeaders httpHeaders = new HttpHeaders();
		if (Objects.nonNull(headers)) {
			headers.forEach((key, value) -> {
				httpHeaders.add(key, value);
			});
		}

		HttpEntity> httpEntity = new HttpEntity>(object, httpHeaders);

     	LOGGER.info("请求地址"+url+"     Header"+JSON.toJSONString(object));
    	reqBO.setSendData( new Gson().toJson(httpEntity));
		LOGGER.info("入参"+ new Gson().toJson(httpEntity));
		 String s = restTemplate.postForObject(url, httpEntity,  String.class);
		reqBO.setReceiveData(s);
		LOGGER.info("出参" + s);
		return s;
	}

	public static RestTemplate  getRestTemplate() {
		SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
		httpRequestFactory.setReadTimeout(35000);
		httpRequestFactory.setConnectTimeout(10000);

		List> messageConverters = new ArrayList>();
		FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
		List supportedMediaTypes = new ArrayList<>();
		supportedMediaTypes.add(MediaType.APPLICATION_JSON);
		supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
		supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
		supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
		supportedMediaTypes.add(MediaType.APPLICATION_PDF);
		supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
		supportedMediaTypes.add(MediaType.APPLICATION_XML);
		supportedMediaTypes.add(MediaType.IMAGE_GIF);
		supportedMediaTypes.add(MediaType.IMAGE_JPEG);
		supportedMediaTypes.add(MediaType.IMAGE_PNG);
		supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
		supportedMediaTypes.add(MediaType.TEXT_HTML);
		supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
		supportedMediaTypes.add(MediaType.TEXT_PLAIN);
		supportedMediaTypes.add(MediaType.TEXT_XML);
		fastConverter.setSupportedMediaTypes(supportedMediaTypes);
		FastJsonConfig fastJsonConfig = new FastJsonConfig();
		fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
		fastConverter.setFastJsonConfig(fastJsonConfig);
		messageConverters.add(fastConverter);
		RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
		restTemplate.setMessageConverters(messageConverters);

		return restTemplate;
	}
}

深入理解RestTemplateicon-default.png?t=M4ADhttps://segmentfault.com/a/1190000020405004

你可能感兴趣的:(微服务,postman,java)