post方式传递多个对象记录(不推荐)

本文介绍了在处理前端POST请求传递多个对象时遇到的问题及解决方法。通过一个背景故事,作者阐述了需要同时处理一个对象和一个列表对象的需求。在尝试使用多个@RequestBody时,作者找到了正确的姿势,并详细描述了Controller层的实现。在实现层,作者提醒注意数据库操作的正确位置,以及将JSONObject转换为JavaBean的技巧。最后,作者总结经验,建议将多个对象整合到一个Map对象中以简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

post方式传递多个对象记录

1.背景

最近前端提个需求,在a表中增加一条数据,找到对应的id,拿到此id新增几条另一b表数据,这就涉及到前端传来一个对象和一个list对象。这就是我脑海中的反应。这就是直接导致我的后续问题。

2.多个@RequestBody的正确姿势

感谢 明明如月小角落的博文正确姿势,我一下子就搜到这个,就被带过去了。
最后我的传递body格式是:

  {
  	"api":{
    "cfgId": 321,
    "name": "321",
    "uri": "321",
    "method": "321",
    "headerJson": null,
    "action": null,
    "payload": null,
    "paramJson": null,
    "responseJson": null,
    "resKeyBody": null,
    "resType": null,
    "resKeyId": null,
    "resKeyName": null,
    "resKeyLabel": null,
    "resKeyVal": null,
    "res_type": null,
    "enable": null
  	},
    "list_point":[{
    	"name": "123",
    	"apiKey": "123",
    "label": "123",
    "mock": null,
    "mockJson": null,
    "expressJson": null,
    "apiGroupId": null
    },{
    	"name": "124",
    	
<think>好的,用户的问题是为什么接口入参为对象时通常选择Post请求,以及是否有其他替代方案。我需要先理解这个问题,然后根据提供的引用资料来组织答案。 首先,用户提到的对象参数通常包含多个属性,可能结构复杂。而HTTP的GET和POST方法在处理参数时有同的机制。根据引用中的资料,比如引用[2]和[4],GET请求的参数是拼接在URL后面,而POST则是放在请求体中。GET有长度限制,而POST没有,或者限制更大。另外,对象参数可能包含敏感信息,用GET的话会暴露在URL中,安全,引用[2]提到GET没有协议体,参数在URL中,这可能带来安全风险。 然后,引用[3]提到使用POST请求发送JSON数据,这可能更适合传递对象。而GET请求通常只能传递简单的键值对,适合嵌套或复杂结构。此外,引用[4]中的代码示例显示GET请求通过HttpServletRequest获取参数,也就是URL参数,而POST可以通过请求体接收更复杂的数据。 接下来,是否有替代方案呢?比如PUT请求,但根据引用[3],PUT通常用于更新资源,可能需要类似的处理方式。或者使用GET的替代方案,比如将对象序列化为字符串放在URL中,但这样会有长度限制和安全问题,引用[2]提到GET参数长度受限。另外,可以分页处理参数,但可能够高效。 然后,需要检查是否有其他引用资料中提到其他方法,比如引用[3]中的DELETE和PUT,但用户的问题主要是关于传递对象参数,所以可能需要说明虽然其他方法可用,但POST仍是主流。 总结下来,回答的结构应该是:首先解释为什么对象参数要用POST,包括参数长度、数据结构、安全性,然后说明GET的限制,最后讨论替代方案,如PUT或其他方法,但指出它们的适用场景和局限性。同时引用相关的引用资料来支持每个观点。</think>### 接口参数为对象时选择Post请求的原因及替代方案 #### 1. **为何对象参数通常选择Post请求?** - **参数长度限制** Get请求将参数拼接在URL中,而URL长度受浏览器和服务器的限制(通常为2KB-8KB)[^2][^4]。对象参数可能包含多个属性或复杂结构,容易超出该限制。Post请求通过请求体输数据,无严格长度限制,适合传递JSON等结构化数据[^3]。 - **数据结构复杂性** 对象通常需要嵌套或键值对之外的格式(如JSON/XML)。Get请求仅支持简单键值对(`?key1=value1&key2=value2`),而Post请求的请求体可承载复杂数据结构[^3]。 - **安全性** Get请求的参数直接暴露在URL中,可能被浏览器历史记录或日志记录适合传递敏感信息(如密码、令牌)。Post请求的参数存储在协议体中,安全性更高。 - **语义化要求** HTTP协议中,Get被定义为“获取资源”,Post被定义为“提交数据”。传递对象参数属于数据提交行为,符合Post的语义规范。 #### 2. **Get请求的限制** - **仅支持URL参数**:无法通过请求体参,复杂对象需序列化为扁平键值对,可能丢失结构信息。 - **编码问题**:特殊字符需手动编码(如空格转为`%20`),增加开发复杂度。 - **缓存风险**:浏览器可能缓存Get请求的URL,导致重复提交或数据泄露[^4]。 #### 3. **替代方案** - **Put请求** 适用于更新资源时传递对象,语法与Post类似(支持请求体参)。但需注意:Put通常要求幂等性(多次调用结果一致),而Post无此限制。 - **Get请求的变通方案** 若对象属性较少,可尝试将JSON序列化为字符串后通过URL参数传递,例如: ``` GET /api/data?payload=%7B%22name%22%3A%22test%22%7D ``` 但需解决URL长度限制和编解码问题。 - **分页参** 将对象拆分为多个Get请求参数,但需后端重新组装,增加复杂度。 #### 4. **总结建议** - **优先使用Post**:适用于大多数对象参场景,符合安全性和语义化要求。 - **特殊场景选择其他方法**:如Put用于更新操作,或Get配合编码处理简单对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值