PHP cURL - json请求的模式不正确

时间:2018-05-10 11:29:17

标签: php json curl

我正在尝试在php中实现以下cURL请求:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: login:password" \
-d '{"phone": "+48667421797", "msg": "Great app! Thank you!"}' \
https://some.endpoint.url

它在控制台中工作正常,我还设法在postman / insomnia等工具中使用此请求。

但是当我尝试在PHP中实现它时:

    $fields = [
        'phone' => $number,
        'msg'   => $msg,
    ];

    $data = json_encode($fields);

    $headers = [
        'Content-Type: application/json',
        'Authorization: login:password'
    ];

    $ch = curl_init($url);

    curl_setopt($ch,CURLOPT_POST, 1);                                                    
    curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);

    curl_setopt($ch, CURLOPT_URL, config('kajaki.sms_url'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);


    $response = curl_exec($ch);

    curl_close($ch);

我得到A 400: Incorrect schema AFAIK指示,请求未作为有效的JSON请求发送。

有什么问题?如何以JSON格式正确发送此请求?

不幸的是,此API不提供任何文档。

2 个答案:

答案 0 :(得分:0)

之前我遇到过类似的问题,我不知道它是否适合您,但您可以尝试addslashes()这样的问题:

$fields = [
    'phone' => "+48667421797",
    'msg'   => "Great app! Thank you!",
];

$data = addslashes(json_encode($fields)); 
// outputs {\"phone\":\"+48667421797\",\"msg\":\"Great app! Thank you!\"}

答案 1 :(得分:0)

您可以编写一个测试脚本来打印收到的JSON字符串,然后根据测试脚本测试CLI curl命令和您的实现。收到的JSON数据是否相同?如果没有,那么PHP实现的数据会有什么不同?

<强>的index.php

<?php
var_dump(file_get_contents('php://input'));

运行测试网络服务器

cd directory/containing/index.php
php -S localhost:12345

在CLI上使用cURL发送数据

user@host $ curl -X POST \
> -H "Content-Type: application/json" \
> -H "Authorization: login:password" \
> -d '{"phone": "+48667421797", "msg": "Great app! Thank you!"}' \
> http://localhost:12345
string(57) "{"phone": "+48667421797", "msg": "Great app! Thank you!"}"

通过PHP使用cURL发送数据

// Modify the URL
curl_setopt($ch, CURLOPT_URL, 'http://localhost:12345');

如果JSON数据相同,您还应该考虑请求的其他部分是否可能无效,例如HTTP标头或URL。