URL范围内的cURL发布数据不符合范围?

时间:2017-07-12 12:15:13

标签: php coldfusion

尝试帮助尝试使用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>

来自API的结果调用的转储显示URL中的变量,如下所示: enter image description here

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的相同转储显示相同的数据,但范围错误:

enter image description here

似乎我们可以在正确的范围内获取数据,我们将取得进展,但我的PHP知识是危险的限制。

1 个答案:

答案 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主体。