【问题标题】:PHP cURL - Incorrect schema for json requestPHP cURL - json 请求的模式不正确
【发布时间】:2018-05-10 11:29:16
【问题描述】:

我正在尝试在 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

它在控制台中运行良好,我还设法在邮递员/失眠等工具中使用此请求。

但是当我尝试像这样在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);

我收到400: Incorrect schema,AFAIK 表示该请求没有作为有效的 JSON 请求发送。

怎么了?如何以 JSON 格式正确发送此请求?

很遗憾,此 API 不提供任何文档。

【问题讨论】:

  • 尝试打印$data并检查它是否是有效的json
  • 正确。我试过了

标签: php json curl


【解决方案1】:

我之前也遇到过类似的问题,不知道对你有没有用,但是你可以试试addslashes() 这样的:

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

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

【讨论】:

  • 我不再收到 400/Incorrect schema,但服务器响应为空,好像根本无法识别请求。
【解决方案2】:

您可以编写一个小测试脚本来打印接收到的 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多