参数gets";丢失”;当使用cURL时


Parameter gets "lost" when using cURL

我正在开发一个接口,在该接口中,我接收一整组事件数据,为另一个系统做好准备,并通过基于web的API将其推送到系统中。

接收和处理数据很好,但当使用cURL时,将数据推送到其他系统会失败。querystring中的最后一个参数似乎丢失了。

我怎么知道?接口响应并告诉我缺少一个强制参数。它似乎总是最后一个。

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

$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请求

取消查询字符串生成并让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)
  )
);

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