import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.JSONObject; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.ResponseErrorHandler; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RestTemplateUtil { private static class DefaultResponseErrorHandler implements ResponseErrorHandler { @Override public boolean hasError(ClientHttpResponse response) throws IOException { return response.getStatusCode().value() != HttpServletResponse.SC_OK; } @Override public void handleError(ClientHttpResponse response) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody())); StringBuilder sb = new StringBuilder(); String str = null; while ((str = br.readLine()) != null) { sb.append(str); } try { throw new Exception(sb.toString()); } catch (Exception ex) { ex.printStackTrace(); } } } /** * @param url * @param params * @return: String */ public static String get(String url, JSONObject params) { RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); String response = restTemplate.getForObject(expandURL(url, params.keySet()), String.class, params); return response; } /** * 将参数都拼接在url之后 * * @param url * @param params * @param mediaType * @return: String */ public static String post(String url, JSONObject params, MediaType mediaType) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(mediaType); HttpEntity<JSONObject> requestEntity = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity<JSONObject>(params, requestHeaders) : new HttpEntity<JSONObject>(null, requestHeaders); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); String result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? restTemplate.postForObject(url, requestEntity, String.class) : restTemplate.postForObject(expandURL(url, params.keySet()), requestEntity, String.class, params); return result; } /** * 发送json或者form格式数据 * * @param url * @param params * @param mediaType * @param clz * @return: String */ public static <T> T post(String url, JSONObject params, MediaType mediaType, Class<T> clz) { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(mediaType); HttpEntity<?> requestEntity = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity<JSONObject>(params, requestHeaders) : (mediaType == MediaType.APPLICATION_FORM_URLENCODED ? new HttpEntity<MultiValueMap<String, String>>(createMultiValueMap(params), requestHeaders) : new HttpEntity<>(null, requestHeaders)); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); T result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? restTemplate.postForObject(url, requestEntity, clz) : restTemplate.postForObject( mediaType == MediaType.APPLICATION_FORM_URLENCODED ? url : expandURL(url, params.keySet()), requestEntity, clz, params); return result; } @SuppressWarnings("unchecked") private static MultiValueMap<String, String> createMultiValueMap(JSONObject params) { MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); for (String key : params.keySet()) { if (params.get(key) instanceof List) { for (Iterator<String> it = ((List<String>) params.get(key)).iterator(); it.hasNext();) { String value = it.next(); map.add(key, value); } } else { map.add(key, params.getString(key)); } } return map; } /** * @param url * @param keys * @return * @return: String */ private static String expandURL(String url, Set<?> keys) { final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?"); Matcher mc = QUERY_PARAM_PATTERN.matcher(url); StringBuilder sb = new StringBuilder(url); if (mc.find()) { if (!url.contains("?") && !url.endsWith("?")) { sb.append("?"); } else { sb.append("&"); } } else { sb.append("?"); } for (Object key : keys) { sb.append(key).append("=").append("{").append(key).append("}").append("&"); } return sb.deleteCharAt(sb.length() - 1).toString(); } }
相关推荐
在SpringMVC中,模型通常是JavaBean,视图由视图解析器如JSP、Thymeleaf或Freemarker处理,控制器则用Java类实现。 3. **注解驱动开发**:SpringMVC支持多种注解,如@Controller、@RequestMapping、@GetMapping、@...
接口调用通常涉及网络请求,可以使用HttpURLConnection、Apache HttpClient或者Spring的RestTemplate等工具。在Java中,这些工具可以发送GET或POST请求,接收JSON或其他格式的数据,并将其转换为Java对象。在这个...
在 Spring MVC 中,可以利用 `RestTemplate` 或者 `WebClient`(Spring 5 之后引入)来调用外部 REST 服务。这些客户端工具允许开发者方便地发送 HTTP 请求,并处理响应。通过 `@RequestMapping` 注解,可以配置...
创建一个工具类来处理JWT的加密和解密操作。通常情况下,这些方法需要包括生成Token、验证Token的有效性等功能。 ```java public class JwtUtils { private static final String SECRET = "secretKey"; public ...
Spring 3.2版本新增了对Servlet 3异步请求处理的支持、改进了Spring MVC的测试框架、增强了内容协商功能、支持泛型的RestTemplate、对@RequestBody参数的支持,以及对日期和时间格式化的全球支持等。另外,Spring ...
4. **万能封装类**:描述中提到的"万能封装类"可能是指一个通用的工具类,用于简化HTTP接口调用的过程。这样的类通常会包含发起请求、处理响应、异常处理等通用逻辑,提高代码复用性,减少重复工作。 5. **...
最后,文档提供了一些通用工具的介绍,比如Apache Commons、Google Guava、Spring以及SpringSide自身提供的工具类,还包括了数据序列化的功能,如XML与JSON的互相转换。 整体来看,SpringSide4参考手册是一份非常...
Spring Cloud能够帮助开发者快速构建分布式系统,如服务注册与发现(Eureka)、配置中心(Config)、API Gateway(Zuul或Gateway)、服务间调用(RestTemplate或Feign)、断路器(Hystrix)等。 手册中的内容可能...
在Spring MVC中,我们可以使用`RestTemplate`或`WebClient`来发送HTTP请求,这两个工具提供了更高级的抽象和便利性,但底层可能依然会利用到URLConnection或类似的机制。 总的来说,这篇文章可能涵盖了如何使用Java...
- 服务间调用:RestTemplate、Feign客户端。 - 服务容错与降级:Hystrix、Resilience4j。 - 分布式配置中心:Config Server。 #### 电商项目实战 1. **需求分析与设计** - 项目背景及目标。 - 系统架构设计:...
webService ##简介 展示了以下j2ee工具的使用 ...2.springMVC,内含webService的客户端调用,即类org.springframework.web.client.RestTemplate 3.hibernate,面向对象操纵数据库 4.json跨域请求,使用filter实现