Je travaille sur un plug-in qui envoie une demande XML à l'API d'expédition d'un fournisseur pour obtenir des devis d'expédition. Le XML est stocké dans une chaîne appelée $ xml. Je peux publier avec succès la demande XML avec curl en utilisant ces paramètres:
$curl = curl_init( $this->settings['api_url'] );
curl_setopt( $curl, CURLOPT_HEADER, 0 );
curl_setopt( $curl, CURLOPT_POST, 1 );
curl_setopt( $curl, CURLOPT_TIMEOUT, 45 );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0 );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $xml );
$result = curl_exec( $curl );
curl_close( $curl );
Ma question est la suivante: comment puis-je faire la même chose avec l'API HTTP WordPress? Je veux maximiser la compatibilité pour ceux qui n'ont peut-être pas de boucle sur leurs serveurs.
Voici la tentative d'API HTTP que j'ai faite:
$result = wp_remote_post(
$this->settings['api_url'],
array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.1',
'headers' => array(
'Content-Type' => 'text/xml'
),
'body' => array(
'postdata' => $xml
),
'sslverify' => 'false'
)
);
J'ai essayé de changer le corps pour simplement:
'body' => array( $xml ),
J'ai essayé de convertir le $ xml en un tableau associatif php avec XML et JSON simples.
Avec toutes mes tentatives, je continue à récupérer une erreur dans la réponse de mon fournisseur: "Le contenu n'est pas autorisé dans prolog." Il semblerait que le fichier XML ne soit pas correctement publié ou que l'API HTTP inclue peut-être une marque d'ordre d'octet (BOM).
En espérant que quelqu'un puisse aider. Merci.
J'ai essayé quelques essais et erreurs supplémentaires et j'ai réussi à le faire fonctionner en plaçant simplement $ xml dans le corps sans le spécifier en tant que tableau. La référence de fonction indique: "Les données de publication doivent être envoyées dans le corps sous forme de tableau", donc je ne sais pas pourquoi cela a fonctionné.
Voici le code de travail au cas où il aiderait quelqu'un d'autre:
// Sends the xml request to the API
$result = wp_remote_post(
$this->settings['api_url'],
array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.1',
'headers' => array(
'Content-Type' => 'text/xml'
),
'body' => $xml,
'sslverify' => 'false'
)
);
Je pense que vous devriez avoir body
comme ceci:
'body' => array( 'username' => 'bob', 'password' => '1234xyz' ),
lisez plus pour plus de détails.
p.s. Je doute que lorsque vous avez converti $xml
en tableau, cela ne fonctionne pas, car dans ce cas, vous auriez pu:
'body' => array( array(........))