web-dev-qa-db-fra.com

Envoyer une requête ajax via CURL

Une demande d'API doit être envoyée. Pour une raison quelconque, le serveur bloque la demande CURL, mais il approuve une demande ajax XHR. Je pourrais envoyer une demande ajax, mais un autre problème se pose: le contenu mixte de mon site Web est diffusé via HTTPS, mais la demande à envoyer est effectuée via HTTP. Je ne peux donc pas utiliser ajax.

Je cherche un moyen de simuler une requête ajax via CURL, en quelque sorte, de faire croire au serveur que la requête CURL est bien une requête ajax.

Voici ce que j'ai essayé.

Ceci est ma demande CURL.

$ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64)');
    curl_setopt($ch, CURLOPT_REFERER, 'server's url');
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept:application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding:gzip, deflate',
    'Accept-Language:en-US,en;q=0.9',
    'Connection:keep-alive',
    'Content-Type: application/json; charset=utf-8',
    'X-Requested-With: XMLHttpRequest',
    '__RequestVerificationToken: $token'
    ));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, base_path().'/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, base_path().'/cookies.txt');
    $buffer = curl_exec($ch);
    if(curl_error($ch))
    {
    $buffer =   curl_error($ch);
    }
    curl_close($ch);

return $ buffer; Cette requête curl est bloquée

Cependant, cette demande ajax passe par mon hôte local, mais comme mon site Web en direct utilise HTTPS, je ne peux pas vraiment l'utiliser.

 $.ajax({
      type: "get",
      xhrFields: { withCredentials:true },
      url: http://apiendpoint.com,
      success: function(data)
      {
       // console.log(data);
      }
})
13
Dhiraj

en chrome, vous pouvez copier une expression curl de travail à partir de la barre d’outils de développement. Essayez avec celui de Cli. Si cela fonctionne, vous pouvez déterminer quelles pièces sont nécessaires et lesquelles ne le sont pas. Ensuite, vous pouvez le transcrire en php.

 developer toolbar -> network -> select a file -> right click - copy -> copy as curl

Si vous avez des doutes si la même chose arrive de php que de curl, essayez simplement avec requestbin .

5
lintabá

Je pense qu'il est possible que l'en-tête du jeton ne soit pas ce que vous pensez, puisque $ a = 1, '$ a' est converti en $ a, mais "$ a" est converti en "1" double citation).

dans votre exemple, essayez de remplacer:

'__RequestVerificationToken: $token'

avec:

"__RequestVerificationToken: $token"

et laissez-nous savoir si cela résout le problème.

Pensez à utiliser passthru ("commande curl here ..."); en utilisant la suggestion de lintabá

0
Felipe Valdes