Obtuve el error 415 “Tipo de medio no admitido” al usar wp_remote_post

3 minutos de lectura

avatar de usuario de camelot
camelote

Intenté enviar una solicitud POST desde WordPress a una API externa (asignar una etiqueta a un usuario en un sistema CRM). Cuando usé cURL, todo estaba bien. Aquí está el código cURL:

function my_function () {

$body = array ( 'tags' => array ( array (
                        'email' => 'xxx@gmail.com',
                        'tag' => 'Customer5'
                        ))
);

$curl = curl_init();

curl_setopt_array($curl, array(

  CURLOPT_URL => "$api_url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode($body, true),
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/json",
    "User-Agent: Your App Name (www.yourapp.com)",
    "Authorization: Basic xxxxxx"
  ),
));

$response = curl_exec($curl);

curl_close($curl);

var_dump($response);

}

add_action( 'init', 'my_function'); 

Pero luego cambié a usar wp_remote_postrecibí una respuesta “415 – Tipo de medio no compatible”.

$body = array ( 'tags' => array (
                            array(
                                'email' => 'xxx@gmail.com',
                                'tag' => 'Customer5'
                            ))
);

$headers = array (
                'Content-Type' => 'application/json',
                'User-Agent' => 'Your App Name (www.yourapp.com)',
                'Authorization' => 'Basic xxxxxx',
);

$request = wp_remote_post('$api_url', $arg );

$arg = array (
    'header' => $headers,
    'body' => json_encode($body, true),
    'method' => 'POST',
    'sslverify' => false,
);

echo '<pre>';
print_r($request);
echo '</pre>';

Probé muchas modificaciones (cambié el formato de matriz asociativa a par clave:valor, agregué AddType a htaccess archivo…), pero nada funcionó. Por favor ayuda, estoy atascado

Avatar de usuario de Sally CJ
Sally C.J.

Extracto de claveCDN:

A 415 Unsupported Media Type se produce un error cuando el servidor de origen
rechaza una solicitud en particular ya que el recurso está en un formato que no es compatible con el servidor para el método HTTP
usó. Este problema de tipo de formato no admitido puede deberse a lo que se define en el recurso Content-Type o Content-Encoding
encabezados

Y en su caso, lo más probable es que el error se haya producido porque su solicitud remota envió el mensaje incorrecto. Content-Type encabezado, que por defecto es application/x-www-form-urlencoded cuando el método HTTP es POST.

Y sí, incluiste el derecho Content-Type valor en tu $headers formación. Pero desafortunadamente en su $arg matriz a la que pasaste wp_remote_post()usaste el clave de matriz incorrectaheaderque en realidad debería ser headers (tenga en cuenta la “s”).

Así que usa headers y no headertal como se puede ver a continuación:

$api_url="your API URL";

$body = array(
    'tags' => array(
        array(
            'email' => 'xxx@gmail.com',
            'tag'   => 'Customer5',
        ),
    ),
);

$headers = array(
    'Content-Type'  => 'application/json',
    'User-Agent'    => 'Your App Name (www.yourapp.com)',
    'Authorization' => 'Basic xxxxxx',
);

$arg = array(
    'headers'   => $headers, // good
//  'header'    => $headers, // bad; i.e. wrong array key ('header')
    'body'      => json_encode( $body ),
    // 'method' can be omitted since you're using wp_remote_post()
    'method'    => 'POST',
    'sslverify' => false,
);

$request = wp_remote_post( $api_url, $arg );
// ..if the response still isn't good, what's the output of this:
var_dump( $request );

¿Ha sido útil esta solución?