web-dev-qa-db-fra.com

Comment dupliquer une requête XML curl en utilisant l'API HTTP?

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.

2
Jason

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'
    )
);
3
Jason

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(........)) 
0
T.Todua