【问题标题】:POST JSON Body with CURL in PHP在 PHP 中使用 CURL 发布 JSON 正文
【发布时间】:2021-12-12 13:25:29
【问题描述】:

我正在运行如下代码

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://chat-service.com/api/direct',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_SSL_VERIFYHOST => 0,
  CURLOPT_SSL_VERIFYPEER => 0,
  CURLOPT_POSTFIELDS =>'{
  "to_number": "62111111111",
  "to_name": "Mr X",
  "message_template_id": "abc123abc123",
  "channel_integration_id": "123abc123abc",
  "language": {
    "code": "id"
  },
  "parameters": {
    "body": [
      {
        "key": "1",
        "value": "name",
        "value_text": "Mr X"
      },
      {
        "key": "2",
        "value": "vehiclereg",
        "value_text": "L0001X"
      },
      {
        "key": "3",
        "value": "date",
        "value_text": "29 Feb 2022"
      }
    ]
  }
}

',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer 1122334455',
    'target_channel: trial'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
?>

现在我想将 CURLOPT_POSTFIELDS 值存储为变量 这是我的代码 但仍然没有运行

<?php

$curl = curl_init();
$data = array
    (
    "to_number"=>'62111111111',
    "to_name"=>'Mr X',
    "message_template_id"=>'abc123abc123',
    "channel_integration_id"=>'123abc123abc',
    "language"=>
    array 
        (
            "code"=>"id"
        ),
    "parameters"=>
    array
        (
            "body"=>array 
            (
                "key"=>"1",
                "value"=>"name",
                "value_text"=>"Mr X"
            ),
            "body"=>array 
            (
                "key"=>"2",
                "value"=>"vehiclereg",
                "value_text"=>"L0001X"
            ),
            "body"=>array 
            (
                "key"=>"3",
                "value"=>"date",
                "value_text"=>"29 Feb 2022"
            )
        )
    );
curl_setopt_array($curl, array(
CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer 1122334455',
    'target_channel: trial'
    ),
CURLOPT_URL => 'https://chat-service.com/api/direct',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POSTFIELDS => http_build_query($data);
));

$response = curl_exec($curl);
curl_close($curl);

echo "<pre>";
print_r($response)

?>

在我看来,这一行是代码无法正常工作但仍不知道如何修复它的原因

运行一个

  "parameters": {
    "body": [
      {
        "key": "1",
        "value": "name",
        "value_text": "Mr X"
      },
      {
        "key": "2",
        "value": "vehiclereg",
        "value_text": "L0001X"
      },
      {
        "key": "3",
        "value": "date",
        "value_text": "29 Feb 2022"
      }
    ]
  }

没有运行

"parameters"=>
    array
        (
            "body"=>array 
            (
                "key"=>"1",
                "value"=>"name",
                "value_text"=>"Mr X"
            ),
            "body"=>array 
            (
                "key"=>"2",
                "value"=>"vehiclereg",
                "value_text"=>"L0001X"
            ),
            "body"=>array 
            (
                "key"=>"3",
                "value"=>"date",
                "value_text"=>"29 Feb 2022"
            )
        )

我试着到处搜索它 在这个上找到一些类似的案例 send post json with php (curl) 但仍然可以修复它

我确实是这样编码的

<?php
$data = array
    (
    "to_number"=>'62111111111',
    "to_name"=>'Mr X',
    "message_template_id"=>'abc123abc123',
    "channel_integration_id"=>'123abc123abc',
    "language"=>
        array 
        (
            "code"=>"id"
        ),
    "parameters"=>
        array
        (
            "body"=>array 
                (
                "key"=>"1",
                "value"=>"name",
                "value_text"=>"Mr X"
                ),
             "body"=>array 
                (
                "key"=>"2",
                "value"=>"vehiclereg",
                "value_text"=>"L0001X"
                ),
             "body"=>array 
                (
                "key"=>"3",
                "value"=>"date",
                "value_text"=>"29 Feb 2022"
                )
        )
    );

echo json_encode($data);
?>

这就是结果

{
  "to_number": "62111111111",
  "to_name": "Mr X",
  "message_template_id": "abc123abc123",
  "channel_integration_id": "123abc123abc",
  "language": {
    "code": "id"
  },
  "parameters": {
    "body": {
      "key": "3",
      "value": "date",
      "value_text": "29 Feb 2022"
    }
  }
}

【问题讨论】:

  • 如果 POST 数据,请尝试使用 json_encode。它可能与多维数组有关。
  • 数据中的主要问题是您希望对 php 关联数组使用相同的键。您使用身体 3 次。键(和数据)相互替换,只有最后一个会留在数组中,其他的会被覆盖。 php.net/manual/en/language.types.array.php
  • @OrbánZoltán 但第一个代码工作正常,这是来自服务器 "body": { "1": "name", "2": "vehiclereg", "3": "date " }
  • @BhojRajBhatta 我确实添加了 json 编码

标签: php json curl


【解决方案1】:

尝试使用

CURLOPT_POSTFIELDS => json_encode($data);

参考 How to POST JSON Data With PHP cURL?

【讨论】:

  • 我做了,但仍然无法修复它
  • 你的parameters有3个键body,再检查一遍
  • 是的,正是我想要修复的 body 假设有 3 个值
  • 我想要访问的服务需要来自body 的 3 值,它是 name 的 key 1,对于 vehiclereg 的 key 2 和 date 的 key3。正如我所说,我的第一个代码运行正常
  • "parameters"=&gt;[["key"=&gt;"1","value"=&gt;"name","value_text"=&gt;"Mr X"],["key"=&gt;"2","value"=&gt;"vehiclereg","value_text"=&gt;"L0001X"], ["key"=&gt;"3", "value"=&gt;"date", "value_text"=&gt;"29 Feb 2022"]], 使用这个或在答案下
【解决方案2】:

终于找到了基于试错和到处谷歌搜索的解决方案

<?php

$curl = curl_init();
$data = 
[
    "to_number"=>'62111111111',
    "to_name"=>'Mr X',
    "message_template_id"=>'abc123abc123',
    "channel_integration_id"=>'123abc123abc',
    "language"=> 
    [
        "code"=>"id"
    ],
    "parameters"=>
    [
        "body" =>
        [ 
            [
                "key"=>"1",
                "value"=>"name",
                "value_text"=>"Mr X"
            ],
            [
                "key"=>"2",
                "value"=>"vehiclereg",
                "value_text"=>"L0001X"
            ],
            [
                "key"=>"3",
                "value"=>"date",
                "value_text"=>"29 Februari 2022"
            ]
        ]
    ]
];
curl_setopt_array($curl, array(
CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Authorization: Bearer 1122334455',
    'target_channel: tria;'
    ),
CURLOPT_URL => 'https://chat-service.com/api/direct',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POSTFIELDS => json_encode($data)
));

$response = curl_exec($curl);
curl_close($curl);

echo "<pre>";
print_r($response);
?>

感谢堆栈溢出的启发

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2011-12-19
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2011-03-31
  • 2010-10-23
  • 2012-06-20
相关资源
最近更新 更多