当前位置: 首页 > news >正文

RestTemplate发送Post请求报错:414 URI Too Long

文章目录

  • 一、报错背景
  • 二、问题分析:414 URI Too Long
    • 2.1、常见原因
  • 三、解决方法
    • 3.1、使用 LinkedMultiValueMap 处理表单数据(推荐)
    • 3.2、将参数拼接到URI上
  • 四、避免误区

一、报错背景

使用RestTemplate发送http Post请求时,返回了一个报错 414 URI Too Long。

因为服务端是Post请求并用@RequestParam进行接收,所以我将参数都拼接在URL后面,如http://localhost:80/add?name=1&age=2 ,导致URL过长。

报错代码

RestTemplate restTemplate = new RestTemplate();// 创建请求体
List<NameValuePair> params = new ArraysList<>();
params.add(new BasicNameValuePair("name","张三"));
params.add(new BasicNameValuePair("age","15"));
//....... 设置大量内容// 设置请求头
HttpHeaders headers = new HttpHeaders();// 创建HttpEntity对象
HttpEntity<String> httpEntity = new HttpEntity<>(null,headers);
URI uri = URI.create(url);
if(!CollectionUtils.isEmpty(params)){String param = URLEncodedUtils.format(params, StandardCharsets.UTF_8);uri = URI.create(url+"?"+param);
}
// 发送POST请求
String response = restTemplate.exchange(uri, HttpMethod.POST, httpEntity , String.class).getBody();

报错内容

org.springframework.web.client.HttpClientErrorException : 414 URI Too Long:"<h1>Bad Message 414</h1><pre>reason: URI Too Long</pre>"

二、问题分析:414 URI Too Long

HTTP状态码414表示客户端发送的请求URI过长,服务器拒绝处理。使用RestTemplate发送POST请求时出现该错误,通常是因为请求参数被错误地附加到URL中而非请求体中,导致URL超过服务器限制长度。

HTTP协议规定,请求的URI长度不能超过2083个字符。这是因为在HTTP/1.1协议中,请求行和请求头字段的总长度被限制在8192字节(不包括CRLF)。

2.1、常见原因

  1. 参数误放在URL中:POST请求本应将参数放在请求体(Body)中,但实际被拼接到了URL末尾。
  2. RestTemplate配置问题:未正确配置HttpMessageConverter,导致参数无法序列化到请求体。
  3. URL编码问题:参数中包含特殊字符未编码,进一步增加URL长度。

三、解决方法

本文报错是由于发送Post请求时,服务端的接口用的是@RequestParam接收参数,而不是json, 所以以下整理几种方法发送@RequestParam入参类型的POST请求。

3.1、使用 LinkedMultiValueMap 处理表单数据(推荐)

本方法是将请求参数放到请求体中,不占用URI的长度,所以就算请求体比较大,也不会报414 URI Too Long的错误。

示例:

RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();
// 设置内容类型为 application/x-www-form-urlencoded
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);// 使用 MultiValueMap 存放表单数据
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("key1", "value1");
formData.add("key2", "value2");
// ... 可以添加很多对,只要不超出服务器对Body大小的通常宽松限制HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);ResponseEntity<String> response = restTemplate.postForEntity("http://your-api-endpoint.com/api/resource", requestEntity, String.class
);

3.2、将参数拼接到URI上

如果你只是想在URL中包含查询参数,可以使用Uri来构建URL。

RestTemplate restTemplate = new RestTemplate();// 创建请求体
List<NameValuePair> params = new ArraysList<>();
params.add(new BasicNameValuePair("name","张三"));
params.add(new BasicNameValuePair("age","15"));
//....... 设置大量内容// 设置请求头
HttpHeaders headers = new HttpHeaders();// 创建HttpEntity对象
HttpEntity<String> httpEntity = new HttpEntity<>(null,headers);
URI uri = URI.create(url);
if(!CollectionUtils.isEmpty(params)){String param = URLEncodedUtils.format(params, StandardCharsets.UTF_8);uri = URI.create(url+"?"+param);
}
// 发送POST请求
String response = restTemplate.exchange(uri, HttpMethod.POST, httpEntity , String.class).getBody();

四、避免误区

  • 不要使用RestTemplate的getForObject发送 POST 请求(GET 请求参数只能在 URL 中,本身就容易触发 414)。
  • 即使是 POST 请求,若通过url + “?key=” + value拼接参数,本质仍是将参数放在 URL 中,会导致同样的错误。
  • 若接口必须要求参数在 URL 中(不符合 POST 规范,但某些旧接口可能如此),则需要缩短参数长度,或联系服务器端放宽 URL 长度限制(不推荐,因为 URL 长度本身有协议限制)。
http://www.dtcms.com/a/494963.html

相关文章:

  • 热力图:从逸出数据到宏观模式识别
  • 解决 gf / gau 与 Oh-My-Zsh 别名冲突的两种办法
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序:社群经济的数字化重构路径
  • 【详解vtkVoxelContoursToSurfaceFilter】:从有序XY平面轮廓生成三维表面
  • 版本控制器Git
  • 网站版建设南通制作企业网站
  • 网站后台管理系统的重要技术指标收录快的门户网站
  • 降本增效:如何用RustFS将企业存储TCO降低50%?
  • 当AI遇到信息系统:以AI+用户推荐的标签生命周期为例——标签为什么需要“死亡“?
  • 数据结构入门 (九):线索的“寻路”指引 —— 详解线索二叉树
  • wordpress 织梦十堰网站优化
  • Vue+ts 如何实现父组件和子组件通信
  • 广告制作网站源码高端网站设计公司
  • cpp-stub工作原理详细举例解析
  • 香港服务器CPU中E5和Gold的区别
  • linux shell编程实战 02 变量与交互式输入
  • 网站下载怎么做如何建一个免费试用网站
  • 【LeetCode热题100(45/100)】二叉树展开为链表
  • VUE封装axios调用
  • python的scikit-image库的功能介绍(亲测)
  • 做go分析的网站第一成品网站超市
  • ArrayList和LinkedList的区别
  • PinWin,一个窗口置顶工具
  • 一键式搜索引擎Hacking工具
  • CasADi:高性能数值优化与自动微分工具库详解
  • 中英文网站建设企业网站列表设计
  • 在 iOS 18 中,控制中心怎样添加应用快捷方式?
  • C++类型转换
  • 【Memory协议栈】Autosar架构下如何加速Fee的切页时间
  • 【C# MVC 前置】异步编程 async/await:从 “卡界面” 到 “秒响应” 的 Action 优化指南(附微软官方避坑清单)