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_post
recibí 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
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 recursoContent-Type
oContent-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 incorrecta — header
que en realidad debería ser headers
(tenga en cuenta la “s”).
Así que usa headers
y no header
tal 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 );