Intento ejecutar file_get_contents() en mi propia ruta utilizada principalmente para AJAX:
file_get_contents($this->router->generate('ajax_get_provinces', array('country' => $country->getName()), true));me sale un error:
Advertencia: file_get_contents ( http://symfony.trainingexperience.org/ajax/get-provinces/Spain ): no se pudo abrir la transmisión: ¡la solicitud HTTP falló! HTTP/1.0 400 Solicitud incorrecta
Acción:
/** * 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); }Este es tu problema yo diría:
if (!$request->isXmlHttpRequest()) { return new JsonResponse(array('message' => $translator->trans('ajax.access.error')), 400); }file_get_contents no establece los encabezados necesarios para que la solicitud se identifique como 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'); }Intente ejecutar su solicitud a través de curl con los encabezados correctos o elimine la verificación XMLHttpRequest en su acción.
Aquí puede leer cómo realizar la solicitud a través de curl: PHP: Simular XHR usando cURL
Editar: para configurar el encabezado requerido con file_get_contents, puede probar esto
$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));Esto podría funcionar si no faltan otros encabezados.
Encontré esto en file_get_contents arroja 400 Error de solicitud incorrecta PHP
Cito: es posible que desee intentar usar curl para recuperar los datos en lugar de file_get_contents. curl tiene mejor soporte para el manejo de errores:
$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);Esto puede darle una mejor idea de por qué está recibiendo el error. Un error común es alcanzar el límite de velocidad en su servidor.