Saltar al contenido

PHP cURL POST devuelve un 415 – Tipo de medio no compatible

Después de de una larga búsqueda de información hemos podido resolver este apuro que tienen ciertos usuarios. Te brindamos la respuesta y nuestro objetivo es servirte de mucha apoyo.

¡Problema resuelto! Aquí está el problema:

Enviando un asociativo-array de encabezados NO FUNCIONA con cURL. Hay varios foros dispersos que muestran ejemplos usando un asociativo array para encabezados. ¡NO LO HAGAS!

El correcto (que también está disperso por Internet, pero que soy demasiado tonto para haberlo notado) es construir tu encabezado key/valor pares como cadenas, y pasar un estándar array de estas cadenas al establecer la opción CURLOPT_HTTPHEADER.

Entonces, en resumen,

INCORRECTO:

$headers = array(    "Accept-Encoding" =>    "gzip",
                     "Content-Type" =>       "application/json",
                     "custom_header_1" =>    "test011",
                     "custom_header_2" =>    "test012",
                     "custom_header_3" =>    "test013");

DERECHO:

$headers = array(    "Accept-Encoding: gzip",
                     "Content-Type: application/json",
                     "custom_header_1: test011",
                     "custom_header_2: test012",
                     "custom_header_3: test013");

Espero que esto sea útil para otros tontos nobles en el futuro antes de que pierdan tanto tiempo depurando como yo.

Si tuviera que adivinar, asumiría que la misma regla se aplica al cuerpo POST key/valor también, razón por la cual el comentario de @drew010 sobre el uso http_build_query() o json_encode() trucar el cuerpo de su mensaje también es una gran idea.

Gracias a todos por sus útiles comentarios y por su tiempo y consideración. Al final, una comparación lado a lado de los tráfico http (capturado a través de Wireshark) reveló el problema.

¡Gracias!

Creo que el problema es que estás pasando un array como el CURLOPT_POSTFIELDS opción. Al pasar un arrayesto obliga a la POST solicitud de uso multipart/form-data cuando el servidor probablemente esté esperando application/x-www-form-urlencoded.

Intenta cambiar

curl_setopt($request, CURLOPT_POSTFIELDS, $this->body);

a

curl_setopt($request, CURLOPT_POSTFIELDS, http_build_query($this->body));

Consulte http_build_query para obtener más información y también esta respuesta: ¿Mi solicitud de cURL confunde a algunos servidores?

Reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *