PHP 用于开发 webservice 的 API 接口与客户端做数据交互时不一定会使用 PHP 可以处理的数据格式进行通信,比如 API 常用的 json xml,在此场景下我们需要使用其他的方式获取客户端发来的数据然后进行处理,下面我们就实例模拟下客户端请求 PHP API 场景下的数据交互方式。
同时要理解 get 请求并未携带表单数据,get 请求的本质是请求服务器的某一资源,其向服务器发送的数据都位于请求头的 Query String/Query Path 中,请求头是 uri,注意理解 get 请求的语意,是去服务器获取资源而不是向服务器发送“数据”。 post 请求则是载有 Form Data 即表单数据的, 是想服务器发送 “数据” 的
get post
可以看出get的参数都是附在请求头中,并不像post中有content-length /content-type /from data 这些描述请求携带的数据内容的属性值
PHP 支持的数据格式(注意:这里说的支持不是指简单的获取到,意为可以进行自动处理,自动填充到 $_POST/ $_FILES中去,再次强调,get 请求并没有向服务器发送“数据”,它是取,不是存,所以 $_GET 的是参数而不是数据)
application/x-www-form-urlencoded 普通的表单数据
multipart/form-data 上传文件的表单 enctype="multipart/form-data"
PHP 不支持的数据格式
application/json
application/xml
不能处理但可以获取到,你可以自己手动处理,参照表
application/x-www-form-urlencoded | multipart/form-data | application/json | application/xml | |
php://input | 可获取 | 不可获取 | 可获取 | 可获取 |
$_POST | 可获取 | 可获取 | 不可获取 | 不可获取 |
$HTTP_RAW_POST_DATA | 可获取 | 不可获取 | 可获取 | 可获取 |
PS: $HTTP_RAW_POST_DATA 已经被 PHP7 废弃,原因是 php://input 完全囊括了它的所有功能,且其对服务器的压力要比 php://input 大很多,最懦弱的是它默认配置下是让位 $_POST 的,如果 $_POST 能处理数据的话他就得靠边站,当然你可以配置 php.ini 将 always_populate_raw_post_data 配置项打开,则会一直填充其所能识别的数据,即便 $_POST 的也能处理。
php://input: 除数据类型为 multipart/form-data 的不能识别外,其他格式都可以获取,而后我们可以根据数据类型处理
$_POST: 可以识别 application/x-www-form-urlencoded multipart/form-data 格式,json xml 无法识别
$HTTP_RAW_POST_DATA :识别能力与 php://input 相同,默认配置下与 $_POST 互斥且优先级低于 $_POST
先贴出服务端代码
注意当发送的数据为 multipart/form-data 时 PHP 会将文件类型的数据存放在 $_FILES 中,文本的存放于 $_POST 中,但他们是同一组的,都是 from data 中的数据,与 $_GET 是不同的,$_GET 中填充的是请求头中 Query String 的参数
<?php/** * @author sallency * @date 2016-3-4 11:03:23 * @desc 简单模拟PHP作为API时如何处理各种格式的数据 */error_reporting(0);echo "==== 客户端发送的数据格式 =====" . PHP_EOL;echo "REQUEST_METHOD: " . $_SERVER['REQUEST_METHOD'] . PHP_EOL;echo "ACCEPT: " . $_SERVER['HTTP_ACCEPT'] . PHP_EOL;echo "CONTENT_TYPE: " . ($_SERVER['CONTENT_TYPE'] ? $_SERVER['CONTENT_TYPE'] : "null") . PHP_EOL;echo PHP_EOL . "===== php://input 数据 ========" . PHP_EOL;echo file_get_contents('php://input') . PHP_EOL;echo PHP_EOL . '===== $_POST 数据 =============' . PHP_EOL;print_r($_POST);//当 multipart/form-data 类型时文件数据是存放在 $_FILES 中的 文本则 $_POST 中echo PHP_EOL . '===== $_FILES 数据 =============' . PHP_EOL;print_r($_FILES);echo PHP_EOL . '===== $HTTP_RAW_POST_DATA =====' . PHP_EOL;echo $HTTP_RAW_POST_DATA ? $HTTP_RAW_POST_DATA : 'null' . PHP_EOL;?>
1、发送 application/x-www-form-urlencoded 标准数据
可以看出 php://input 和 $_POST/$_FILES 里都能正常识别接收此类型的数据,其实 $_HTTP_RAW_POST_DATA 也能接受,但我们说过默认情况下它和 $_POST/$_FILES 是互斥且优先级低,所以 $_POST/$_FILES 中有数据时它就不会被填充了,可修改配置让他一直填充自己可识别的数据。
2、发送 multipart/form-data
php://input 和 $HTTP_RAW_POST_DATA 为空,说明它俩无法识别此类行的数据流(其实也只是不能识别此类行的,其他的都没问题),$_POST/$_FILES 则可以正常识别
3、发送 application/json 格式
数据体:
php://input 和 $HTTP_RAW_POST_DATA 可识别, $_POST 则无法识别
4、发送 application/xml 格式
数据体:
php://input 和 $HTTP_RAW_POST_DATA 可识别, $_POST 则无法识别
总结 当然还有很多其他的数据类型我们就不做测试了,大家可以自己动手。
application/x-www-form-urlencoded 是 PHP 的标准数据流类型, 可以被三者识别
multipart/form-data 只能被 $_POST/$_FILES 识别处理,另外的两者无法识别
application/json application/xml 等就只能被 php://input 和 $HTTP_RAW_POST_DATA 识别了,这也是我们日常开发接口时往往使用 php://input 数据输入流来获取客户端请求携带的数据

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver CS6
视觉化网页开发工具

Atom编辑器mac版下载
最流行的的开源编辑器