我应该在请求中处理意外的 json 字段吗?

Posted

技术标签:

【中文标题】我应该在请求中处理意外的 json 字段吗?【英文标题】:Should I deal with unexpected json fields in a request? 【发布时间】:2021-03-31 02:12:23 【问题描述】:

我应该处理请求中的意外 json 字段吗?假设我已将 paymentDTO 作为控制器的输入;

public class PaymentDTO 
    private String fromAccountNumber;
    private String toAccountNumber;
    private BigDecimal amount;

... constructor
... getters 
... setters

我期望的请求是:


"fromAccountNumber": "1",
"toAccountNumber": "2",
"amount": 50.0

如果用户发布如下请求怎么办:


"fromAccountNumber": "1",
"toAccountNumber": "2",
"amount": 50.0,
"customField1": 100,
"anotherField2: "data"

它会导致我的 Spring Boot 控制器出现任何问题吗?如果是这样,我应该如何处理意外的json请求字段?

【问题讨论】:

这能回答你的问题吗? Ignoring new fields on JSON objects using Jackson 【参考方案1】:

我的建议是在不匹配的属性上失败(即 400 错误请求,不是 500)。这样一来,客户的错误就会更快地显现出来。

【讨论】:

这个。额外的字段意味着您的客户可能对 BE 的工作方式有错误的期望【参考方案2】:

如果您使用的是 springboot,在您的 application.properties 文件中添加此行将忽略未知属性:

spring.jackson.deserialization.fail-on-unknown-properties=false

【讨论】:

OP 不是在问如何全局配置它,而是在问它可能有什么影响。 @fluffy,我认为最后一个问题是询问如何处理未知属性。我给出了一种解决方案:全局忽略它们,以免出现任何错误。 Yekta 表示控制器可能有问题,因此忽略属性将确保控制器在反序列化 body 时不会抱怨 我不同意。这个问题的标题是我应该..?.,所以听起来更像是一个问题是否值得做某事。接下来,倒数第二个问题是问它会导致任何问题吗...?——到底是什么类型的问题?客户端-服务器协商?安全风险?性能问题?第三个也是最后一个问题是问 ...我应该如何处理意外的 JSON ...? 是否要求忽略字段? @flufy,我问你一个问题。如何处理未知的 JSON 属性?除了忽略他们?我不是问这个问题的人,但标题的意义是:我应该如何处理请求中的意外 json 字段? 这确实是一个好问题,至少还有两个选项:1)在未映射的属性上失败(默认的 Jackson 行为,对吗?导致 HTTP 400 Bad Request 简单地拒绝用户输入); 2)在忽略/失败的同时记录未映射的属性,以便收集有关入站请求的更多信息(AFAIK,而不是 Jackson 内置)。我确实相信这取决于特定的应用程序要求,而这些从 OP 的要求中并不清楚。如果他们使用 Gson 而不是 Jackson 怎么办?我宁愿先澄清这个问题。

以上是关于我应该在请求中处理意外的 json 字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

请求()有一个意外的关键字参数“json”[重复]

JSON处理(一):HTTP请求响应的JSON化 @RequestBody 和 @ResponseBody

SyntaxError:ajax请求中位置1的JSON中的意外标记o

AFNetworking 可以处理请求队列吗?

为了一个HTTP请求问题,差点和iOS干起来

请求完成处理程序致命错误:在展开可选值异常时意外发现 nil