1

我的任务是发布到只接受 JSON 的 API。我正在使用 PHP 的 CURL 来完成此操作。

我之前已经发布到 API 没有任何问题,但从来没有使用 JSON,这是我不熟悉的东西,我试图自己研究并解决问题,但我没有任何运气。

在与我试图发帖的公司的某人交谈时,我被告知我的服务器正在访问他们的服务器,唯一的错误是我的帖子正文没有正确格式化 JSON ..(这家公司没有人知道 php :(所以那里没有帮助)

这是我的代码:

$jarr = array("ProviderID" => "L005A", "FirstName" => $first, 
           "LastName" => $last, "PhoneNumber" => $PhoneNumber, 
           "PhoneNumberType" => $PhoneNumberType);

$content = json_encode($jarr);

$curl_handle = curl_init("URL Im posting to");
 curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array(
'Accept: application/json;charset=utf-8',
    'Content-Type: application/json;charset=utf-8',
    'Expect: 100-continue',
    'Connection: Keep-Alive'));
    curl_setopt($curl_handle, CURLOPT_HEADER, 1);
    curl_setopt($curl_handle, CURLOPT_POST, 0);
    curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $content);
    curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $first = curl_exec($curl_handle);
    curl_close($curl_handle);
    echo "Result ";
    echo $first;

从我得到的文档中,我必须遵循的唯一参数是:
方法:发布

标头:
接受:application/json;charset=utf-8
内容类型:application/json;charset=utf-8
期望:100-continue
连接:Keep-Alive

目前,当我执行脚本时,我得到以下回报:

结果 HTTP/1.1 100 继续 HTTP/1.1 400 错误请求 Cache-Control: no-cache Pragma: no-cache Content-Type: application/json; charset=utf-8 过期:-1 服务器:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 日期:星期四,2012 年 11 月 1 日 15:43:18 GMT 内容长度: 26 {"record.ProviderID":[""]}

所以导致 400 错误是因为我的正文格式不正确。我的问题,我将如何格式化我需要以正确的 JSON 格式发送的数据?

根据我的阅读,这段代码应该这样做,但它没有:

$jarr = array("ProviderID" => "L005A", "FirstName" => $first,
           "LastName" => $last, "PhoneNumber" => $PhoneNumber,
           "PhoneNumberType" => $PhoneNumberType);

$content = json_encode($jarr);
4

1 回答 1

0

我遇到了同样的问题。调试后发现,在发送 JSON 字符串时,没有引用或双引号 Integer 值是罪魁祸首。您需要将双引号整数值作为字符串发送。

例如:

{"PhoneNumber":9876543210}

或者

{"PhoneNumber":"9876543210"}

不管用。

{"PhoneNumber":"N_9876543210"}

将工作。

一旦我弄清楚这个问题的根本原因是什么,就会立即更新。如果有人知道,请尽快更新。

编辑:通过 URL 编码解决的问题。我希望它也能解决你的情况。

于 2013-01-02T06:33:38.997 回答