我尝试在我自己用于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);
}
答案 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);
这可能会让您更好地了解收到错误的原因。常见的错误是达到服务器的速率限制。