RestTemplate发送请求并携带header信息

1、使用restTemplate的postForObject方法

  注:目前没有发现发送携带header信息的getForObject方法。

HttpHeaders headers = new HttpHeaders();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {String key = (String) headerNames.nextElement();String value = request.getHeader(key);headers.add(key, value);
}        
String restStrResult = restTemplate.postForObject(url, /*携带header*/new HttpEntity<String>(headers), String.class,
             /*携带parameter*/request.getParameterMap());

2、使用restTemplate

import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;public class RestTemplateUtil {private RestTemplate restTemplate;public void setRestTemplate(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public String post(ServletRequest req, String url, Map<String, ?> params) {ResponseEntity<String> rss = request(req, url, HttpMethod.POST, params);return rss.getBody();}public String get(ServletRequest req, String url, Map<String, ?> params) {ResponseEntity<String> rss = request(req, url, HttpMethod.GET, params);return rss.getBody();}public String delete(ServletRequest req, String url, Map<String, ?> params) {ResponseEntity<String> rss = request(req, url, HttpMethod.DELETE, params);return rss.getBody();}public String put(ServletRequest req, String url, Map<String, ?> params) {ResponseEntity<String> rss = request(req, url, HttpMethod.PUT, params);return rss.getBody();}/*** @param req* @param url* @param method* @param params maybe null* @return*/private ResponseEntity<String> request(ServletRequest req, String url, HttpMethod method, Map<String, ?> params) {HttpServletRequest request = (HttpServletRequest) req;//获取header信息HttpHeaders requestHeaders = new HttpHeaders();Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String key = (String) headerNames.nextElement();String value = request.getHeader(key);requestHeaders.add(key, value);}//获取parameter信息if(params == null) {params = request.getParameterMap();}HttpEntity<String> requestEntity = new HttpEntity<String>(null, requestHeaders);ResponseEntity<String> rss = restTemplate.exchange(url, method, requestEntity, String.class, params);return rss;}
}

 3.restTemplate以json格式发送post请求

  1.发送请求

  public String _post(ServletRequest req, String url, Map<String, ?> params) {HttpServletRequest request = (HttpServletRequest) req;//拿到header信息HttpHeaders requestHeaders = new HttpHeaders();requestHeaders.setContentType(MediaType.APPLICATION_JSON);Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String key = (String) headerNames.nextElement();String value = request.getHeader(key);requestHeaders.add(key, value);}net.sf.json.JSONObject jsonParams = net.sf.json.JSONObject.fromObject(params);HttpEntity<net.sf.json.JSONObject> requestEntity = new HttpEntity<net.sf.json.JSONObject>(jsonParams, requestHeaders);String result = restTemplate.postForObject(url, requestEntity, String.class);return result;}

  2.接收处理

   @RequestMapping("/xxx")  @ResponseBody  public String xxx(HttpServletRequest request) throws IOException {  String jsonString = getBodyString(request.getReader());  JSONObject jbJsonObject = new JSONObject().fromObject(jsonString);  User user = (User) JSONObject.toBean(jbJsonObject, User.class);  System.out.println(jbJsonObject);  System.out.println("id:" + user.getUserName());return null;  }  @RequestMapping("/xxx2")  @ResponseBody  public String xxx2(User user) throws IOException {  System.out.println("---------------");  System.out.println(user.getUserName());  System.out.println(user.getPassWord());  System.out.println("---------------");  if (true) {  return "success";  } else {  return "fail";  }  }  public String getBodyString(BufferedReader br) { String inputLine; String str = ""; try { while ((inputLine = br.readLine()) != null) { str += inputLine; } br.close(); } catch (IOException e) { System.out.println("IOException: " + e); } return str; }

 

4. RestTemplate 的两个 postForObject方法的使用

  private static String post(String url, JSONObject params, MediaType mediaType) {RestTemplate restTemplate = new RestTemplate();//拿到header信息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 ResponseErrorHandler() {@Overridepublic boolean hasError(ClientHttpResponse response) throws IOException {return response.getStatusCode().value() != HttpServletResponse.SC_OK;}@Overridepublic void handleError(ClientHttpResponse response) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody()));String str = null;while((str = br.readLine()) != null) {System.out.println(str);}}});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;}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()) {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();}

 

5.最强版RestTemplateUtils

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 org.springframework.web.client.RestTemplate;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;/*** @Title: RestTemplateUtils.java* @Prject: sensorsdata* @Package: com.springboottest.sensorsdata.utils* @Description: TODO* @author: hujunzheng* @date: 2017年4月20日 下午2:07:18* @version: V1.0*/
public class RestTemplateUtils {/*** @ClassName: DefaultResponseErrorHandler* @Description: TODO* @author: hujunzheng* @date: 2017年4月20日 下午2:15:27*/private static class DefaultResponseErrorHandler implements ResponseErrorHandler {@Overridepublic boolean hasError(ClientHttpResponse response) throws IOException {return response.getStatusCode().value() != HttpServletResponse.SC_OK;}@Overridepublic 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 e) {e.printStackTrace();}}}/*** @param url* @param params* @return* @Title: get* @author: hujunzheng* @Description: TODO* @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;}/*** @param url* @param params* @param mediaType* @return* @Title: post* @author: hujunzheng* @Description: 将参数都拼接在url之后* @return: String*/public static String post(String url, JSONObject params, MediaType mediaType) {RestTemplate restTemplate = new RestTemplate();// 拿到header信息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;}/*** @param url* @param params* @param mediaType* @param clz* @return* @Title: post* @author: hujunzheng* @Description: 发送json或者form格式数据* @return: String*/public static <T> T post(String url, JSONObject params, MediaType mediaType, Class<T> clz) {RestTemplate restTemplate = new RestTemplate();//这是为 MediaType.APPLICATION_FORM_URLENCODED 格式HttpEntity 数据 添加转换器//还有就是,如果是APPLICATION_FORM_URLENCODED方式发送post请求,//也可以直接HttpHeaders requestHeaders = new HttpHeaders(createMultiValueMap(params),true),就不用增加转换器了restTemplate.getMessageConverters().add(new FormHttpMessageConverter());// 设置header信息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>(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;}private static MultiValueMap<String, String> createMultiValueMap(JSONObject params) {MultiValueMap<String, String> map = new LinkedMultiValueMap<>();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* @Title: expandURL* @author: hujunzheng* @Description: TODO* @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()) {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();}
}

 

转载于:https://www.cnblogs.com/hujunzheng/p/6018505.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作中常用到的命令

linux zip 和 unzip http://blog.csdn.net/shenyunsese/article/details/17556089 linux 查看日志 http://blog.chinaunix.net/uid-15463753-id-2943532.html linux 删除 http://www.jb51.net/LINUXjishu/179430.html linux查看末尾日志&#xff08;tail -f&#xff09; http:/…

tomcat开发远程调试端口以及利用eclipse进行远程调试

一、tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里&#xff1a;   SET CATALINA_OPTS-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address8899   Linux系统 在catalina.sh里&#xff1a;   CATALINA_OPTS&q…

webpack+react+redux+es6开发模式

一、预备知识 node, npm, react, redux, es6, webpack 二、学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入门教程 redux middleware 详解 Redux研究 React 入门实例教程 webpack学习demo NPM 使用介绍 三、工程搭建 之前有写过 webpackreactes6开发模式…

fiddler发送post请求

1.指定为 post 请求&#xff0c;输入 url Content-Type: application/x-www-form-urlencoded;charsetutf-8 request body中的参数格式&#xff1a;userNameadminicxp&userPassword123qwe!# 这种方式可以用 request.getParameter的方式来获得。 2.指定为 post 请求&#xff…

基于spring注解AOP的异常处理

一、前言 项目刚刚开发的时候&#xff0c;并没有做好充足的准备。开发到一定程度的时候才会想到还有一些问题没有解决。就比如今天我要说的一个问题&#xff1a;异常的处理。写程序的时候一般都会通过try...catch...finally对异常进行处理&#xff0c;但是我们真的能在写程序的…

Kettle之数据抽取、转换、装载

Kettle 官网 ETL利器Kettle实战应用解析系列 利用kettle组件导入excel文件到数据库 kettle中实现动态SQL查询 java中调用kettle转换文件 kettle 7.x版本下载&#xff1a;https://pan.baidu.com/s/1nvnzzCH  密码&#xff1a;6f5c mac 下运行spoon.sh,  windows下为spoon.bat…

webpack+react+redux+es6开发模式---续

一、前言 之前介绍了webpackreactreduxes6开发模式 &#xff0c;这个项目对于一个独立的功能节点来说是没有问题的。假如伴随着源源不断的需求&#xff0c;前段项目会涌现出更多的功能节点&#xff0c;需要独立部署运行。为了更好地管理这些独立的功能节点&#xff0c;我们需要…

JdbcTemplate使用小结

org.springframework.jdbc.core.JdbcTemplate.query(String sql, Object[] args, RowMapper<StaffUnionVO> rowMapper) throws DataAccessException 1.自定义rowMapper public class StaffUnionVO implements RowMapper<StaffUnionVO>, Serializable {private stat…

RabbitMQ安装和使用(和Spring集成)

一、安装Rabbit MQ   Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接下载安装3.2.3 版本&#xff1a; 下载并安装 Eralng OTP For Windows (vR16B03)运行安装 Rabbit MQ Server Windows Installer (v3.2.3)具体…

单点登录实现(spring session+redis完成session共享)

一、前言 项目中用到的SSO&#xff0c;使用开源框架cas做的。简单的了解了一下cas&#xff0c;并学习了一下 单点登录的原理&#xff0c;有兴趣的同学也可以学习一下&#xff0c;写个demo玩一玩。 二、工程结构 我模拟了 sso的客户端和sso的服务端&#xff0c; sso-core中主要是…

maven deploy上传私服出错

error 内容如下 Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5: deploy (default-deploy) on project XXX pom文件增加如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifa…

加密策略

一、前言 这两天研究了一下项目中的密码加密&#xff0c;可以说得上是学到了很多。下面来大致说一下。 二、常用加密 1.单向加密算法 单向加密算法主要用来验证数据传输的过程中&#xff0c;是否被篡改过。 BASE64 严格地说&#xff0c;属于编码格式&#xff0c;而非加密算法 …

Spring Data JPA: 实现自定义Repository

一、前言 由于项目中的 实体&#xff08;entity&#xff09;默认都是继承一个父类&#xff08;包含一些公共的属性&#xff0c;比如创建时间&#xff0c;修改时间&#xff0c;是否删除&#xff0c;主键id&#xff09;。为了实现逻辑删除&#xff0c;一般会自己实现RepositoryFa…

java json和对象互相装换

java json和对象互相装换 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper 转载于:https://www.cnblogs.com/hujunzheng/p/6593491.html

js冲刺一下

js中__proto__和prototype的区别和关系 1.对象有属性__proto__,指向该对象的构造函数的原型对象。  2.方法除了有属性__proto__,还有属性prototype&#xff0c;prototype指向该方法的原型对象。 深入浅出妙用 Javascript 中 apply、call、bind ***两道面试题*** 关于js中伪数…

springmvc 源码分析

DispatcherServlet的初始化流程 HandlerMapping - RequestMappingHandlerMapping初始化 DefaultAnnotationHandlerMapping 和RequestMappingHandlerMapping RequestToViewNameTranslator请求到视图名称的转换 (如果没有responsebody&#xff0c;并且没有返回一个view&#xff0…

EntityManager的使用

1、最基础的查询 CriteriaBuilder cb entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq cb.createQuery(User.class); Root<User> root cq.from(User.class); //from User cq.select(root); //select * from User javax.persistence.criteria.Predi…

Jackson序列化实例

参考文章 Jackson使用ContextualSerializer在序列化时获取字段注解的属性 使用BeanSerializerModifier定制jackson的自定义序列化(null值的处理) 关于使用ContextualSerializer的补充 BeanSerializerFactory中有如下代码&#xff0c; 关于设置SerializerModifier&#xff0c;如…

maven自定义脚手架(快速生成项目)

Maven之自定义archetype生成项目骨架 利用脚手架生成 新项目 命令行方式 mvn archetype:generate \ -DarchetypeGroupIdcom.xxx \ -DarchetypeArtifactIdarchetype-spring-boot \ -DarchetypeVersion1.0.0 \ -DgroupIdcom.xxx \ -DartifactIddemo-archetype-generate \ -Dversi…

JSONObject 自定义过滤配置

一、自定义过滤器说明 PropertyPreFilter 根据PropertyName判断是否序列化   PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化   NameFilter 修改Key&#xff0c;如果需要修改Key,process返回值则可   ValueFilter 修改Value   BeforeFilter 序列化时…