Symfony2 - file_get_contents()在同一个项目api url上失败

时间:2017-04-28 12:20:29

标签: php symfony http request

我尝试在我自己用于AJAX的路径上执行file_get_contents()

file_get_contents($this->router->generate('ajax_get_provinces', array('country' => $country->getName()), true));

我收到错误:

  

警告:   的file_get_contents(http://symfony.trainingexperience.org/ajax/get-provinces/Spain):   无法打开流:HTTP请求失败! HTTP / 1.0 400错误请求

动作:

/**
 * GET method
 *
 * @Route("/ajax/get-provinces/{country}", name="ajax_get_provinces")
 *
 * @param $country
 * @param Request $request
 *
 * @return JsonResponse
 */
public function getProvinces($country, Request $request)
{
    $translator = $this->get('translator');

    if (!$request->isXmlHttpRequest()) {
        return new JsonResponse(array('message' => $translator->trans('ajax.access.error')), 400);
    }

    ...

    return new JsonResponse($provinces, 200);
}

2 个答案:

答案 0 :(得分:2)

我会说这是你的问题:

if (!$request->isXmlHttpRequest()) {
    return new JsonResponse(array('message' => $translator->trans('ajax.access.error')), 400);
}

file_get_contents未将请求的标题设置为XmlHttpRequest(X-Requested-With)

/**
 * Returns true if the request is a XMLHttpRequest.
 *
 * It works if your JavaScript library sets an X-Requested-With HTTP header.
 * It is known to work with common JavaScript frameworks:
 *
 * @see http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
 *
 * @return bool true if the request is an XMLHttpRequest, false otherwise
 */
public function isXmlHttpRequest()
{
    return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}

尝试使用正确的标头通过curl执行请求,或者删除操作中的XMLHttpRequest检查。

在这里,您可以阅读如何通过curl发出请求: PHP: Simulate XHR using cURL

编辑: 要使用file_get_contents设置所需的标头,您可以尝试使用

$options = array(
    'http' => array(
        'header'  =>  "Accept:application/json\r\n" .
                      "X-Requested-With:XMLHttpRequest\r\n",
        'method'  => 'GET'
    ),
);

$context = stream_context_create($options);

file_get_contents($this->router->generate('ajax_get_provinces', array('country' => $country->getName()), true, $context));

如果没有其他标题丢失,这可能会有效。

答案 1 :(得分:0)

我在file_get_contents throws 400 Bad Request error PHP

找到了这个

我引述: 您可能希望尝试使用curl来检索数据而不是file_get_contents。 curl更好地支持错误处理:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 
$this->router->generate('ajax_get_provinces', array('country' => $country->getName()), true)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);

这可能会让您更好地了解收到错误的原因。常见的错误是达到服务器的速率限制。