【问题标题】:Store data received from third parts in endpoint URL with PHP使用 PHP 将从第三方接收到的数据存储在端点 URL 中
【发布时间】:2020-07-01 14:46:42
【问题描述】:

我正在尝试使用 PHP 从第三方 API 系统接收到我的 URL 端点的数据响应。所以第三部分是向我的端点(我在他们的 API 面板中填写的 url)发送一个发布请求,只要他们有新的数据响应给我。基本上,当他们从他们的系统收到新的提交时,他们只会发送最后的响应数据。我已经在我的端点 URL 上添加了这个,看看我是否可以看到收到的数据响应:

$request_data = file_get_contents('php://input');

var_dump($request_data);

在他们的面板上,我可以测试端点 url 结果,在他们的面板上,当我点击 test request 按钮时,我得到了这个结果,这基本上是我的var_dump 的结果:

但在我这边,输出就像一个完整的字符串,但在我的端点 URL 上我没有得到任何东西。

这是我的 phpinfo 文件中的post_max_size,所以我的 $_POST 变量不应该为空:

我应该期望接收到我的 URL 端点的提交数据的格式如下:

{
    "data": {
        "id": "",
        "name": "",
        "email": "",
        "phone": "",
        "description": "",
        "street": "",
        "housenumber": "",
        "postcode": "",
        "city": "",
        "questions": {
            "Type opdracht": "",
            "Wat wil je laten opstellen?": ""
        },
        "questions_unmapped": {
            "114": "",
            "187": ""
        },
        "date": "",
        "notes": ""
    }
}

有什么办法:

  • 将此字符串转换为 PHP 对象
  • 在我这边打印/存储这些数据(我的端点 URL)

【问题讨论】:

  • 您检查过 $_POST 变量是否包含任何数据吗?
  • array(0) { } 两边都有 $_POST。
  • 好的,然后我会 1) 检查 $_REQUEST 变量,看看他们是否使用另一种 HTTP 方法发送请求 2) 检查 PHP 错误日志,看看是否有任何错误可能表明另一个问题
  • 仍然使用 $_REQUEST 获取 array(0) { }。
  • @thephper post_max_size=8M 所以它不是空的。

标签: php api endpoint


【解决方案1】:

我使用 Curl 脚本模拟了您发布的第 3 方 API,如下所示

$data_string = '{
"operacion": {
   "tok": "[generated token]",
   "shop_id": "12313",
   "respuesta": "S",
   "respuesta_details": "respuesta S",
   "extended_respuesta_description": "respuesta extendida",
   "moneda": "PYG",
   "monto": "10100.00",
   "authorization_number": "123456",
   "ticket_number": "123456789123456",
   "response_code": "00",
   "response_description": "Transacción aprobada.",
   "security_information": {
       "customer_ip": "123.123.123.123",
       "card_source": "I",
       "card_country": "Croacia",
       "version": "0.3",
       "risk_index": "0"
   }
}}';


$ch = curl_init('http://localhost/test/index.php');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
'Content-Type: application/json',                                                                                
'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);
echo $result;

在我的 index.php 中,我模拟了您的 URL 端点,如下所示

$request_data = file_get_contents('php://input');   
$decoded_params = json_decode($request_data,true);
var_dump($decoded_params);

我得到的输出是这个。

Array
(
[operacion] => Array
    (
        [tok] => [generated token]
        [shop_id] => 12313
        [respuesta] => S
        [respuesta_details] => respuesta S
        [extended_respuesta_description] => respuesta extendida
        [moneda] => PYG
        [monto] => 10100.00
        [authorization_number] => 123456
        [ticket_number] => 123456789123456
        [response_code] => 00
        [response_description] => Transacción aprobada.
        [security_information] => Array
            (
                [customer_ip] => 123.123.123.123
                [card_source] => I
                [card_country] => Croacia
                [version] => 0.3
                [risk_index] => 0
            )

    )

)

我刚刚对您的端点代码进行了以下更改

$decoded_pa​​rams = json_decode($request_data); => $decoded_pa​​rams = json_decode($request_data,true);

【讨论】:

    【解决方案2】:

    除非您收到带有Content-Type: multipart/form-data 的请求,否则您应该能够使用以下方法获取请求的正文:

    $request_data = file_get_contents('php://input');
    

    现在,如果您收到 multipart/form-data 请求并且您无法修改其正文的内容类型,您可以尝试更改 php.ini (PHP 5.4+) 中的以下选项:

    enable_post_data_reading = On
    

    这将允许您使用 php://input 解析 POST 请求,但是它将禁用 PHP 内部数组 $_POST 甚至 $_FILES 上数据的自动解析。在以下页面上查看有关此选项的更多信息:https://www.php.net/manual/en/ini.core.php#ini.enable-post-data-reading

    您可以在以下页面(查找:php://input)上阅读为什么无法为multipart/form-data 准备好请求正文:https://www.php.net/manual/en/wrappers.php.php

    收到请求后,可以通过以下方式进行解析(假设是一个JSON字符串,就像你提供的图片中的样子):

    $jsonRequest = json_decode($requestBody, true);
    

    json_decode 文档:https://www.php.net/manual/es/function.json-decode.php

    【讨论】:

      【解决方案3】:

      乌戈尔兄弟,

      我要做的是,每当有人向我们的 API(端点)发送 post 请求时

      解决方案

      方法一

      1. 将 json 保存到数据库的 tbl_input_json 中
      2. 然后,当管理员访问系统时,他们可以决定是否要将这些 json 记录永久插入到数据库的表中。

      方法二

      1. 直接用json_decode把字符串变成php数组
      2. 然后,直接将所有这些记录插入到数据库中。

      ** 希望这能解决你的好奇心。

      【讨论】:

        【解决方案4】:

        尝试 $_POST 实例 file_get_contents('php://input');

        【讨论】:

        • 我在 $_POST 的两边都得到了 array(0) { }。
        猜你喜欢
        • 2022-09-23
        • 2019-09-14
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多