在php中调用URL错误

时间:2016-07-08 06:40:38

标签: php php-carbon

我正在创建一个从外部API调用的字符串URL,首先我得到两个日期,开始和结束:

$start = new Carbon($request->date_start);
$end = new Carbon($request->date_end);

只有日期值通过$ request对象传递(2016年6月25日)。

然后我在URL字符串中使用这些值:

$url = "https://www.api.com/KML/PositionHistory?fromDate=" . $start->toDateTimeString() . "&toDate=" . $end->addHours(24)->toDateTimeString();

调用网址:

$contents = file_get_contents($url);

这是我收到错误的地方,因为它试图调用以下URL:

https://www.api.com/KML/PositionHistory?fromDate=2016-07-17 00:00:00&toDate=2016-08-01 00:00:00

它正在创建&字符串,我将如何解决此问题?

请注意,日期结束时的时间是必需的。

编辑:

在时间戳上使用urlencode并在通话前修剪$url会导致以下错误:

file_get_contents(https://www.api.com/KML/PositionHistory?fromDate=2016-07-17+00%3A00%3A00&toDate=2016-08-01+00%3A00%3A00):

failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request

好的,所以这就是entiendoNull所做的工作:

只需使用http_build_query

进行网址构建即可
$arr = [
           'fromDate' => $start->toDateTimeString(),
           'toDate'   => $end->addHours(24)->toDateTimeString(),
       ];

$url = "https://www.api.com/KML/LatestPositions?" . http_build_query($arr);

$contents = file_get_contents($url);

3 个答案:

答案 0 :(得分:1)

试试这个。

$arr = array('fromDate' => $start->toDateTimeString(),'toDate' => $end->addHours(24)->toDateTimeString());
$url = 'https://www.api.com/KML/PositionHistory?';   
$url .= http_build_query($arr,'','&');


$contents = file_get_contents($url);

答案 1 :(得分:0)

Carbon返回包含空格的时间戳,然后在URL中处理错误。您需要在使用urlencode将时间戳放入URL之前对其进行编码。然后在接收方使用urldecode,然后再使用GET数据。

答案 2 :(得分:0)

使用urlencode()trim()

$start = new Carbon($request->date_start);
$end = new Carbon($request->date_end);

$url = "https://www.api.com/KML/PositionHistory?fromDate=" . urlencode($start->toDateTimeString()) . "&toDate=" . urlencode($end->addHours(24)->toDateTimeString());

$url = trim($url); // use trim 

$contents = file_get_contents($url);