Coop API - 使用PHP发布

时间:2010-09-29 17:37:56

标签: php xml json api curl

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

谢谢!

4 个答案:

答案 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
));