目录
回复内容:
首页 后端开发 php教程 如何更好的处理用户上传的JSON数据?

如何更好的处理用户上传的JSON数据?

Jun 06, 2016 pm 08:44 PM
java json php

用户上传JSON数据到我们服务端,我们需要进行解析处理,之后我们再上传到云端。现在我们这边有两种意见:

第一种就是在服务端进行JSON格式校验,包括解析后需要上传到云端的数据都需要进行校验后才上传。因为JSON嵌套的层次较深,我们每解析一层都需要判断是否为空。只要出现为空就直接进行错误处理。

第二种则是假定用户上传的数据都是合法的,只要在最外层捕获一个异常,保证该线程不会挂,里面解析和处理都不用做任何判断和校验。两种各有利弊,请问下这种情况,一般该如何处理?

回复内容:

用户上传JSON数据到我们服务端,我们需要进行解析处理,之后我们再上传到云端。现在我们这边有两种意见:

第一种就是在服务端进行JSON格式校验,包括解析后需要上传到云端的数据都需要进行校验后才上传。因为JSON嵌套的层次较深,我们每解析一层都需要判断是否为空。只要出现为空就直接进行错误处理。

第二种则是假定用户上传的数据都是合法的,只要在最外层捕获一个异常,保证该线程不会挂,里面解析和处理都不用做任何判断和校验。两种各有利弊,请问下这种情况,一般该如何处理?

不正确的数据必须挡在第一道大门之外

首先不能假定处理失败(抛出异常) == 数据有错误。这两点肯定没有必然的联系。总会有数据业务逻辑上必须,但不填却不会引发程序的致命错误。

当然也可以说把数据的校验,跟随着事务处理的过程逐步进行。但这会导致两个问题:

  1. 时间的拖延,不能立刻得到数据合法与否的反馈结果;用户总是会用各种想不到的办法试验API,他们希望犯错时得到立刻的反馈,而不是等服务器处理半天失败了才知道。
  2. 执行了一半的事务还要特意丢弃,浪费服务器处理资源,绝对不如对非法数据干脆就不开启事务。

请坚持得到用户数据输入时第一时间进行校验。对于RESTful风格API而言,你可以考虑返回对应的HTTP错误状态码以及JSON格式的错误信息正文,帮助用户得到正确的反馈。


题外话。

对于API接口还差一点儿。但对网页表单接口来说,在这个目的上Node.js就会体现出绝大的优势:对于Node.js程序来说,前端和后端的数据校验代码是直接复用的!

如果对于一般的PHP后端来说,可能就要想点办法了。我建议可以自己规定一套统一的JSON格式校验表,定义哪些数据字段需要哪些约束条件(required、email、number等),然后前后段查同一张校验表,去写通用的代码做校验。

比较忌讳的是同一个目的的校验代码,手工用原生的JS和PHP写两份——维护两份同样目的代码的同步,做过就知道会死人了!

看你们对出现为空的数据的定义是什么:如果正确的数据允许出现空,就要进行空判断和错误处理;如果出现空肯定是错误的数据,那么在外层捕捉异常即可。

1、上传之前判断关键数据是否为空
2、上传到服务端全部验证
3、展示或用的时候,要处理异常

  1. 异常和线程挂掉有必然联系吗?数据异常校验导致线程挂掉,只能说是程序的异常处理机制没做好。很多人都喜欢捕捉到异常后直接抛出堆栈信息,而不是对异常进行处理,每次见到这种处理,我都会抓狂。抛出了,还得去分析抛出原因,甚至是分许需求,坑人呢。例如:if(){....},这样就结束了。我靠。else呢,就算你不记录日志,或者其他处理,至少也得打印一下,让人一调试就知道,哦。问题出现在这里了。而不是靠IDE的debug一步步去跟进。(题外话,啰嗦了。)。。。相信lz只要出现为空就直接进行错误处理,所谓的处理就是直接把线程干掉。。。囧。。。

  2. 至于第二点,我不知道lz是基于客户的善良,还是基于客户就是自己,居然假设“用户上传的数据都是合法的”,对于编程人员,这种假设是最致命的,无论是从设计还是编码,因为你根本就无法完全代表得了客户的所有操作,其实这也证明了上面的看法,lz的程序对于异常处理不够健壮。可能编写的时候,就只考虑了正常输入状态,而没有考虑非正常输入状态。所以在设计或者编码时,最好不要假设客户怎样怎样。如果真的假设了,请拿出能支撑着假设的数据。上面的,你假设上传的数据是合法的,你自己问一下,如果说服老板或者客户你的这个假设是成立的(请客户保证每次输入都是合法的?)你的假设应该是这样的:上传时程序已经对数据经过了严密的验证,数据基本保证符合格式(对不起,意外永远都会出现),后面的程序获取的数据都是合法的。如何证明后面的程序获取数据是合法的,把验证的程序拿出来,这就是证明的。当然,验证程序不够严谨,或者有些没有加入验证程序,这是另外一方面的。毕竟也有人会追问:你如何证明你的验证程序的准确率,有没有验证。。

  3. 最后一点,从安全性来说,数据至少是得经过验证的。经过验证的数据,至少能过滤掉已知的潜在危险。

  4. 对于lz的问题,除非是用户上传的数据不重要,不然都是要经过数据验证的.

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

说明匹配表达式(PHP 8)及其与开关的不同。 说明匹配表达式(PHP 8)及其与开关的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表达式是一种新的控制结构,用于根据表达式的值返回不同的结果。1)它类似于switch语句,但返回值而非执行语句块。2)match表达式使用严格比较(===),提升了安全性。3)它避免了switch语句中可能的break遗漏问题,增强了代码的简洁性和可读性。

Java程序查找胶囊的体积 Java程序查找胶囊的体积 Feb 07, 2025 am 11:37 AM

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

See all articles