我想通过PHP为api发布数组。我已经使用了oAuth 1.0,但是如何使用oAuth POST JSON body数组。
<? php
//code start
try
{
$postData = array(
'ProductID' => $productID,
'InventoryType' => $InventoryType,
'ProductCostPrice' => $productCost
);
$postData = json_encode($postData);
$oauth = new OAuth($this->consumer_key, $this->consumer_secret);
$oauth->enableDebug(); // simple debug flag for checking error messages
$oauth->disableSSLChecks(); // avoids an SSL issue when testing
$oauth->setToken($this->access_token, $this->token_secret);
## POST JSON body array ##
$oauth->setBody('body',$postData);
##
$url = $this->product_update_url.$productID;
$oauth->fetch($url, OAUTH_AUTH_TYPE_FORM);
$response_info = $oauth->getLastResponseInfo();
header("Content-Type: {$response_info["content_type"]}");
$dataList = (array) json_decode($oauth->getLastResponse());
echo "<pre>";
print_r($dataList);
echo "</pre>";
exit;
} catch(OAuthException $E) {
Mage::log('error', null, 'error.log');
}
==================
网址:http://php.net/manual/en/class.oauth.php
请帮助,我怎么能用oAuth POST json body array。
答案 0 :(得分:1)
请求参数在OAuth1 spec中规范化的方式意味着您只应在身体采用url编码格式(即param1=value1¶m2=value2
或arr[]=val1&arr[]=val2
)
这是由于OAuth1计算请求签名的方式,包括按字母顺序按名称对参数进行排序。
在上面的例子中 - 如果可能的话 - 你应该尝试形成url-encode数据数组。
$postData = array(
'ProductID' => $productID,
'InventoryType' => $InventoryType,
'ProductCostPrice' => $productCost
);
// "ProductID=1&InventoryType=widget&ProductCostPrice=3.5"
$body = http_build_query($postData);
...
$oauth->setBody('body', $body);
如果由于某种原因无法做到这一点,您需要确保在解码请求时未在签名计算中使用请求正文。
如果您使用HTTPS作为API(您应该使用),那么您应该可以使用签名中无法验证的请求正文。如果您允许对API的HTTP请求,您应该有一些机制来确认请求正文未被更改。
我看到的方法是散列JSON正文字符串,然后将该散列作为查询参数包含在请求中(因此它包含在签名计算中)。然后,作为API解码过程的一部分,您将确认JSON正文哈希值与签名查询值。
这个问题有点陈旧,但我通过谷歌搜索找到了它,所以我认为最好为未来的搜索者留下答案。