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() { @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()));
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 { @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 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();
}
}

RestTemplate发送请求并携带header信息的更多相关文章

  1. RestTemplate发送请求并携带header信息 RestTemplate post json格式带header信息

    原文地址:  http://www.cnblogs.com/hujunzheng/p/6018505.html RestTemplate发送请求并携带header信息   v1.使用restTempl ...

  2. 发送请求时携带了参数,但是浏览器network没有显示的排错思路

    发送请求时携带了参数,但是浏览器network没有显示的排错思路 不知道大家有没有遇到这样子的情况就是发送请求的时候明明携带了参数,但是浏览器的network中就是没有!请看下图和代码! 我发送请求用 ...

  3. 如何利用fiddler篡改发送请求和截取服务器信息

    一.断点的两种方式 1.before response:在request请求未到达服务器之前打断 2.after response:在服务器响应之后打断 二.全局打断 1.全局打断就是中断fiddle ...

  4. 【spring】RestTemplate发送请求,请求第三方接口 的几种请求方式POST,GET,DELETE,PUSH

    org.springframework.web.client.RestTemplate 参考地址:http://www.cnblogs.com/UniqueColor/p/7123347.html G ...

  5. RestTemplate支持GET方法携带Body信息

    首先必须声明: GET方法支持通过Body携带参数(HTTP1.1开始支持) 但是默认的RestTemplate是不支持滴!原因如下: RestTemplate支持通过setRequestFactor ...

  6. curl发送请求时携带cookie-转载未验证

    <?php header('Content-Type:text/html;charset=utf-8'); echo "<pre>"; function curl ...

  7. RestTemplate的逆袭之路,从发送请求到负载均衡

    上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载 ...

  8. 精讲RestTemplate第10篇-使用代理作为跳板发送请求

    本文是精讲RestTemplate第10篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层 ...

  9. axios添加了header信息后发送的get请求自动编程option请求了

    axios添加了header信息后发送的get请求自动编程option请求了 webpack 代理转发 Provisional headers are shown 在Vue中如何使用axios跨域访问 ...

随机推荐

  1. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  2. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  3. x:bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用{x:Bind} 解决办法

    这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...

  4. Java 输出流中的flush方法

    转自:http://blog.csdn.net/jiyangsb/article/details/50984440 java中的IO流中的输出流一般都有flush这个操作,这个操作的作用是强制将缓存中 ...

  5. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  6. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  7. 初学者看过来之JSON入门

    1. 什么是JSON JSON---Javascript Object Notation,前两个单词大家应该都认识,最后一个notation,是"记号.标记法"的意思,连在一起,便 ...

  8. C#使用GET、POST请求获取结果

    C#使用GET.POST请求获取结果,这里以一个简单的用户登陆为例. 1. 使用GET请求获取结果 1.1 创建LoginHandler.aspx处理页面 protected void Page_Lo ...

  9. MyBatis源码分析(二)语句处理器

    StatementHandler 语句处理器,主要负责语句的创建.参数的设置.语句的执行.不负责结果集的处理. Statement prepare(Connection connection, Int ...

  10. Android之数据存储的五种方法

    1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...