我正在尝试使用CURL及其API对Web服务进行简单的发布,但我得到了422响应。我的代码如下:
include 'CurlRequest.php';
$secret_key = 'mykeyhere';
$group_id = 'group_id';
$postData = array(
'group_id' => $group_id,
'key' => $secret_key,
'status' => 'test'
);
$curl = new CurlRequest('http://coopapp.com/statuses/update.json');
$curl->exec(array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($postData)
));
我正在使用现有的Curl Library来处理这些帖子。我确定它与我正在格式化POST网址的方式有关(我尝试了很多不同的方式)或者我发布数据的方式。
他们的文档在这里:http://coopapp.com/api/statuses
谢谢!
答案 0 :(得分:1)
对于像这样的API,HTTP错误似乎很奇怪。
Co-Op API文档有点......好吧..混淆状态更新,因为它讨论了POST数据,但示例显示了一个查询字符串。你可以做的是尝试将东西放在查询字符串中,或者不使用CURL。 PHP的file_get_contents实际上是一个可用的HTTP客户端,如果你传递足够的参数。所以试试这个:
$params = array(
'group_id' => $group_id,
'secret_key' => $secret_key,
'status' => 'test'
);
$context = stream_context_create(
array(
'http' => array(
'method' => 'POST'
))
);
file_get_contents("http://coopapp.com/statuses/update.json?" .
http_build_query($params), false, $context);
如果这不起作用,可以通过在没有CURL的情况下做同样的事情来排除CURL错误:
$params = array(
'group_id' => $group_id,
'secret_key' => $secret_key,
'status' => 'test'
);
$context = stream_context_create(
array('http' => array(
'method' => 'POST',
'content' => http_build_query($params)
))
);
file_get_contents("http://coopapp.com/statuses/update.json", false, $context);
请注意,我尚未测试代码,因此可能需要进行一些错误检查/修复。
答案 1 :(得分:1)
这是来自api页面的引用
POST /statuses/update.xml?group_id =#{GROUP_ID}&安培;状态=一种%20encoded%20status&安培;键=#{SECRET_KEY}
它应该是关键而不是secret_key
$postData = array(
'group_id' => $group_id,
'key' => $secret_key,
'status' => 'test'
);
答案 2 :(得分:1)
该解决方案缺少content-type
'application/json'
。
这是工作代码:
include 'CurlRequest.php';
$key = 'mykeyhere';
$group_id = '1234';
$status = 'Awesome status update';
$curl = new CurlRequest('http://coopapp.com/statuses/update.xml?group_id=' . $group_id . '&key=' . $key);
$curl->exec(array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(array('status' => $status)),
CURLOPT_HTTPHEADER => array("Content-Type: application/json")
));
答案 3 :(得分:0)
我认为您不应该json_decode()
POSTFIELDS数据,不是吗?响应将是JSON,但输入应该是POST字段。根据{{3}}:
要在HTTP“POST”操作中发布的完整数据。要发布文件,请在文件前加上@并使用完整路径。这可以作为urlencoded字符串传递,如'para1 = val1& para2 = val2& ...',或者作为一个数组,字段名称作为键,字段数据作为值。如果value是数组,则Content-Type标头将设置为multipart / form-data。
这应该有效:
$curl = new CurlRequest('http://coopapp.com/statuses/update.json');
$curl->exec(array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData
));