使用cURL时参数“丢失”

时间:2016-05-06 13:11:17

标签: php curl

我正在开发一个界面,我收到一大堆事件数据,为另一个系统做准备,并通过基于Web的API将其推送到系统中。

接收和处理数据工作正常,但是当使用cURL时,将其推入另一个系统会失败。似乎来自查询字符串的最后一个参数丢失了。

我怎么知道?界面响应并告诉我缺少必需参数。它似乎永远是最后一个。

这是我构建查询字符串的方法(缩短了一点)

$URI = 'http://remote-interface-host/serviceurl?';

$querystring .= 'city='.urlencode(utf8_decode($town));
$querystring .= '&street='.urlencode(utf8_decode($street));
$querystring .= '&location='.urlencode(utf8_decode($location));
$querystring .= '&start='.$start;
$querystring .= '&end='.$end;
$querystring .= '&text='.urlencode(utf8_decode(trim($description)));
$querystring .= '&title='.urlencode(utf8_decode(trim($title)));
$querystring .= '&website='.urlencode(utf8_decode($website));

$textlanguage = '&languageid=1522908220065994400';  
$querystring .= $textlanguage;

$fullcurl = $URI.$querystring;

$data = docurlcall($fullcurl);

docurlcall()非常简单

function docurlcall($url)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER => 0,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_URL => $url,
        CURLOPT_POST => 1,      
        CURLOPT_USERAGENT => 'my-interface'
    ));

    $result = json_decode(curl_exec($curl));

    curl_close($curl);

    return $result;
}

来自远程接口的反馈

{ "success":false, "message":"missing required parameter 'languageid'", }

据我所知,这应该是对cURL的好用,所以我不明白为什么他会删除最后一个参数。但也许这只是出现不同错误的症状。

任何可能出错或缺失的想法?

请注意旁边:我坚持使用cURL,因为外部接口的开发人员担心GET请求数据可能会变得太大(我删除了图像和更多信息以获得更好的可读性),所以我必须这样做使用cURL的POST请求。

1 个答案:

答案 0 :(得分:1)

它不是一个更好的设置来摆脱查询字符串生成并让PHP为你工作吗?

$parameters = array(
  'city'        => urlencode(utf8_decode($town)),
  'street'      => urlencode(utf8_decode($street)),
  'location'    => urlencode(utf8_decode($location)),
  'start'       => $start,
  'end'         => $end,
  'text'        => urlencode(utf8_decode(trim($description))),
  'title'       => urlencode(utf8_decode(trim($title))),
  'website'     => urlencode(utf8_decode($website)),
  'languageid'  => '1522908220065994400'
);

$data = docurlcall(
  sprintf(
    "%s?%s",
    "http://remote-interface-host/serviceurl",
    http_build_query($parameters)
  )
);

这可以导致更简单的错误搜索(至少更干净的代码会让我更简单地捕获错误:)。