我正在尝试使用cURL发送带有POST请求的JSON文本。 JSON文本是:
{“频道”:“我的频道”,“用户名”:“TriiNoxYs”,“文字”:“我的文字”}
我正在使用此代码:
<?php
$data = array(
'username' => 'TriiNoxYs',
'channel' => 'My channel'
'text' => 'My text',
);
$data_json = json_encode($data);
$curl = curl_init('my-url');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_json))
);
$result = curl_exec($curl);
echo $result ;
?>
代码有效但我想在我的JSON文本中添加“附件”数组,如下所示:
{“频道”:“我的频道”,“用户名”:“TriiNoxYs”,“文字”:“我的文字”,“附件”:[{“text”:“第1行”,“颜色”:“ #000000“},{”text“:”第2行“,”颜色“:”#ffffff“}]}
所以我试着将它添加到我的$ data数组中:
'attachments' => '[{"text":"Line 1", "color":"#000000"}, {"text":"Line 2", "color":"#ffffff"}]',
但是没有工作,帖子被发送但我的“附件”被忽略了...... 我还尝试使用以下代码直接从Linux终端发送POST:
POST https://myurl.com
payload={"channel": "My channel", "username": "TriiNoxYs", "text": "My text", "attachments": [{"text":"Line 1","color":"#000000"},{"text":"Line 2","color":"#ffffff"}]}
它的工作...... 我只是不明白为什么它使用手动POST而不是php / curl ...
感谢你的回答,TriiNoxYs。 PS:抱歉我的英语不好,我是法国人......
答案 0 :(得分:0)
你正在做双json_encode。
首先,比较这两个:
$json1 = json_encode([
'firstname' => 'Jon',
'lastname' => 'Doe',
'hp' => [
'cc' => '+1',
'number' => '12345678'
]
);
//You should get
//{"firstname":"Jon","lastname":"Doe","hp":{"cc":"+1","number":"12345678"}}
而且:
$json2 = json_encode([
'firstname' => 'Jon',
'lastname' => 'Doe',
'hp' => "['cc' => '+1', 'number' => '12345678']"
]);
//You should get
//{"firstname":"Jon","lastname":"Doe","hp":"['cc' => '+1', 'number' => '12345678']"}
你看到了问题吗?您将attachments
密钥设置为json编码字符串,因此当它被发送到目标服务器时,它将被视为字符串'[{"text":"Line 1", "color":"#000000"}, {"text":"Line 2", "color":"#ffffff"}]'
,而不是预期的文本颜色对数组。没有什么好看的,这纯粹是一个粗心的错误:)
所以要解决这个问题,而不是在attachments
键中发送json编码的字符串,而是使用它:
$data = array(
'username' => 'TriiNoxYs',
'channel' => 'My channel'
'text' => 'My text',
'attachments' => array(
array(
"text" => "Line 1",
"color" => "#000000",
),
array(
"text" => "Line 2",
"color" => "#ffffff"
)
)
);