Springboot使用RestTemplate发送Post请求postForEntity (application/json)的坑

Springboot使用RestTemplate发送Post请求postForEntity (application/json)的坑当使用 RestTemplate 进行 http 请求时 的确很方便 但是当需要进行 post 请求时遇到了坑 1POST 传递参数 采用 LinkedMultiV 不能使用 HashMapStrin http posturl MultiValueMa String String map newLinkedMul lt String String

当使用RestTemplate进行http请求时,的确很方便,但是当需要进行post请求时遇到了坑

1POST传递参数 :采用 LinkedMultiValueMap ,不能使用HashMap

String url = 'http://posturl'; MultiValueMap 
  
    map= new LinkedMultiValueMap 
   
     (); map.add("shopid","1"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity 
    
      > request = new HttpEntity 
     
       >(map, headers); return restTemplate.postForEntity(url, request,String.class); 
      
     
    
  

  • 注意 上面的请求支持参数类型均为String类型,如果MultiValueMap

     LinkedMultiValueMap 会将value放进list中,key –> [value]

2 采用JSONObject或者实体类传递参数

 RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); headers.setContentType(type); headers.add("Accept", MediaType.APPLICATION_JSON.toString()); JSONObject param = new JSONObject(); param.put("username", "123"); HttpEntity 
  
    formEntity = new HttpEntity 
   
     (param.toString(), headers); String result = restTemplate.postForObject(url, formEntity, String.class); 
    
  
  • 使用这种方式可以传递任意类型的参数,避免上面的情况

总结,遇到这种问题时多看看源码会很有帮助。

public class LinkedMultiValueMap 
  
    implements MultiValueMap 
   
     , Serializable, Cloneable { private static final long serialVersionUID = L; private final Map 
    
      > targetMap; public LinkedMultiValueMap() { this.targetMap = new LinkedHashMap(); } public LinkedMultiValueMap(int initialCapacity) { this.targetMap = new LinkedHashMap(initialCapacity); } public LinkedMultiValueMap(Map 
     
       > otherMap) { this.targetMap = new LinkedHashMap(otherMap); } @Nullable public V getFirst(K key) { List 
      
        values = (List)this.targetMap.get(key); return values != null && !values.isEmpty() ? values.get(0) : null; } public void add(K key, @Nullable V value) { List 
       
         values = (List)this.targetMap.computeIfAbsent(key, (k) -> { return new LinkedList(); }); values.add(value); } public void addAll(K key, List 
         values) { List 
        
          currentValues = (List)this.targetMap.computeIfAbsent(key, (k) -> { return new LinkedList(); }); currentValues.addAll(values); } public void addAll(MultiValueMap 
         
           values) { Iterator var2 = values.entrySet().iterator(); while(var2.hasNext()) { Entry 
          
            > entry = (Entry)var2.next(); this.addAll(entry.getKey(), (List)entry.getValue()); } } public void set(K key, @Nullable V value) { List 
           
             values = new LinkedList(); values.add(value); this.targetMap.put(key, values); } public void setAll(Map 
            
              values) { values.forEach(this::set); } public Map 
             
               toSingleValueMap() { LinkedHashMap 
              
                singleValueMap = new LinkedHashMap(this.targetMap.size()); this.targetMap.forEach((key, values) -> { if (values != null && !values.isEmpty()) { singleValueMap.put(key, values.get(0)); } }); return singleValueMap; } 
               
              
             
            
           
          
         
        
       
      
     
    
  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208182.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:09
下一篇 2026年3月19日 下午12:10


相关推荐

  • Python中的程序控制结构 顺序结构和选择结构

    Python中的程序控制结构 顺序结构和选择结构程序控制结构 Python 中的程序控制结构 1 程序中的组织结构 2 顺序结构 3 对象的布尔值 4 分支结构 4 1 单分支 if 结构 4 2 双分支 if else 结构 4 3 多分支 if elif else 结构 4 4if 语句的嵌套 4 5 条件表达式 5 pass 空语句 Python 中的程序控制结构 1 程序中的组织结构任何简单或复杂的算法都可以由顺序结构 选择结构和循环结构这三种基本结构组合而成 2 顺序结构程序从上到下顺序地执行代码 中间没有任何的判断和跳转 直到程序结束 顺序结构 把大

    2026年3月16日
    3
  • 5分钟完成桌面小游戏项目「建议收藏」

    5分钟完成桌面小游戏项目「建议收藏」地址复制到

    2022年5月6日
    52
  • 非极大值抑制(Non-Maximum-Suppression)

    非极大值抑制(Non-Maximum-Suppression)include include include include 新版本写在下面文件中 include include opencv2 features2d features2d hpp includeusing usingnamespa voidnms conststd vecto

    2026年3月17日
    3
  • django通用视图通俗讲解_视图的种类通常有

    django通用视图通俗讲解_视图的种类通常有前言上篇我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:generics.ListA

    2022年8月7日
    7
  • L1正则化和L2正则化讲解

    L1正则化和L2正则化讲解L1 正则化和 L2 正则化讲解 在机器学习实践过程中 训练模型的时候往往会出现过拟合现象 为了减小或者避免在训练中出现过拟合现象 通常在原始的损失函数之后附加上正则项 通常使用的正则项有两种 L1 正则化和 L2 正则化 L1 正则化和 L2 正则化都可以看做是损失函数的惩罚项 所谓惩罚项是指对损失函数中的一些参数进行限制 让参数在某一范围内进行取值 L1 正则化的模型叫做 LASSO 回归 L2 正则化的模型叫做岭回归 LASSO 回归公式 min12m i 1m f x y i 2 w 1min fr

    2026年3月7日
    4
  • PyCharm专业版的安装[通俗易懂]

    PyCharm专业版的安装[通俗易懂]本教程只适合Windows1.首先到官网下载PyCharm专业版:http://www.jetbrains.com/pycharm/download/#section=windows2.双击打开后开始安装这里选择你所安装的目录这里选择创建桌面快捷方式以及关联.py文件静静等待安装:这里选择运行PyCharm 然后单机Finish:

    2022年8月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号