尝试帮助尝试使用PHP访问和API的人。我使用ColdFusion的代码可以很好地发布到API,但我们无法让PHP工作。在CF中,代码使用urlparams发送数据:
<cfhttp url="https://example.com/_api/proxyApi.cfc" method="post" result="httpResult" charset="UTF-8">
<cfhttpparam type="url" name="method" value="apiauth"/>
<cfhttpparam type="url" name="argumentCollection" value="#jsData#"/>
</cfhttp>
method = apiauth是主要的授权函数,然后argumentCollection中的json字符串通过apiauth传递给API中的更正函数。
从PHP他的curl发布为表单数据,而不是URL,并且API抱怨所需信息丢失,因为它的范围错误。我一直试图弄清楚如何使curl使用URL范围:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $target_url,
CURLOPT_POST => 1,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_AUTOREFERER => true,
CURLOPT_POSTFIELDS => array(
'method' => 'apiauth',
'argumentCollection' => $json
)
));
来自API的相同转储显示相同的数据,但范围错误:
似乎我们可以在正确的范围内获取数据,我们将取得进展,但我的PHP知识是危险的限制。
答案 0 :(得分:1)
您正在CF示例中发送空POST。
<cfhttpparam type="url"
作为查询字符串参数处理,如:
https://example.com/_api/proxyApi.cfc?method=apiauth&argumentCollection=...
因此,您对URL范围的转储(键值配对查询字符串)显示数据。
要将这些参数放入POST主体,您可以使用:
<cfhttpparam type="formfield"
然后您的FORM范围将显示数据。
您的PHP cURL执行后者:它将您的参数添加到POST正文。
如果您希望cURL作为示例CF代码,请改为:
// add the parameters to the URL's query string
// start with & instead of ?, if the URL already contains a query string, see comment below snippet
$target_url .= '?'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $target_url,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_AUTOREFERER => true
));
$target_url
中没有查询字符串:
$target_url = 'https://example.com/_api/proxyApi.cfc';
$target_url .= '?'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json);
$target_url
中的查询字符串:
$target_url = 'https://example.com/_api/proxyApi.cfc?p=';
$target_url .= '&'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json);
旁注:您可能不希望通过查询字符串发送JSON,因为查询字符串的限制大约为2000个字符(取决于浏览器和Web服务器)。如果您的JSON很复杂,您的查询字符串将被截断并使所有内容变得混乱。请改用POST主体。