php - 使用 php 来自 webhook 的空响应
问题描述
创建或更新新记录时,会触发 Webhook 并在帖子正文中发布三个键。其中一个名为 payload 的键包含带有记录属性的编码 JSON。
这是 POST 正文消息的示例:请参阅此处的有效负载
我想在 webhook 触发时创建一个文件并将日期发布到文件中,但我得到的是空的有效负载。
这是代码。
<?php
/**
* Created by PhpStorm.
* User: Lee N
* Date: 16/07/2018
* Time: 14:46
*/
$data = file_get_contents('php://input');
//decode JSON data to PHP array
$content = json_decode($data, true);
if($content ==""){
$data = "Payload fired but no datkhkjhkjhjka";
}else{
$data = $content;
}
$pagename = 'from_vend';
$newFileName = $pagename.".txt";
if (file_put_contents($newFileName, $data) !== false) {
echo "File created (" . basename($newFileName) . ")";
} else {
echo "Cannot create file (" . basename($newFileName) . ")";
}
解决方案
您的 POST 请求是 x-www-form-urlencoded。引用维基百科(强调我的):
当 Web 浏览器从 Web 表单元素发送 POST 请求时,默认的 Internet 媒体类型是“application/x-www-form-urlencoded”。这是一种使用可能重复的键对键值对进行编码的格式。每个键值对由一个“&”字符分隔,每个键与其值由一个“=”字符分隔。键和值都通过用 '+' 字符替换空格然后对所有其他非字母数字 [9] 字符使用 URL 编码来进行转义。
当您向 PHP 发送这样的 POST 请求时,它将自动填充$_POST
键/值对。因此,为了访问 JSON 有效负载,请使用
$decodedJson = json_decode($POST['payload']);
鉴于php://input
(引用PHP 手册):
一个只读流,允许您从请求正文中读取原始数据。
由于这是原始数据(如完整的帖子正文),您需要先运行它parse_str
才能解码 JSON 有效负载(这是 PHP 在 中为您自动执行的操作$_POST
)。
如果你想写完整的帖子正文,你可以删除json_decode
. 因为完整的帖子正文不是 JSON,因此不会解码为 JSON。
推荐阅读
- c# - Microsoft Edge 进程 ID 更改,如何更改/跟踪它?
- javascript - JavaScript 在 onSubmit 中的循环内获取
- flutter - Flutter 上传文件到 php 服务器
- sql - 从制表符分隔的文本文件批量插入表中,文件中不存在附加列
- azure - 是否可以使用 Azure 资源管理器 API 向队列或主题发送和检索消息
- python - ModuleNotFoundError:没有名为 '_tkinter' Heroku 的模块
- flutter - 在颤动中对齐的自定义错误文本
- r - 如何将行转换为R中的一个数组?
- javascript - 如何防止 NaN 作为各种数值计算的返回值?
- typeorm - TypeORM Left Join 以使用 ID 获取团队名称