web-dev-qa-db-fra.com

Comment utiliser curl pour obtenir une requête GET identique à l'utilisation de Chrome?

J'ai une api web http://something.com/api et je souhaite utiliser GET pour obtenir le corps de la réponse.

Ceci est ma commande:

curl "http://something.com/api"

Bien sûr, cela échoue et donne un message d'erreur.

Lorsque j'utilise Chrome et que j'entre l'URL ci-dessus, tout est correct. Cependant, je fais la même chose avec Firefox, l'URL me donne le même message d'erreur. J'essaie de répéter l'action avec Chrome extension DHC, la requête donne à nouveau une réponse correcte. Après quelques recherches, je pense que l’option curl --user-agent fait une différence. Quelle est la bonne façon de définir l'agent utilisateur sur Chrome? Ou ce n'est pas le point, le problème vient d'autres domaines? Merci beaucoup.

60
wdetac

Si vous devez définir la chaîne d’en-tête de l’utilisateur dans la requête curl, vous pouvez utiliser le paramètre -H option pour définir l’agent utilisateur comme:

curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

L'utilisation d'un outil proxy tel que Charles Proxy aide vraiment à simplifier les choses, comme ce que vous demandez. Voici ce que je fais, en utilisant cette page SO à titre d'exemple (à partir de juillet 2015 avec la version 3.10 de Charles)):

  1. Faites courir Charles Proxy
  2. Effectuer une demande Web à l'aide d'un navigateur
  3. Rechercher la demande souhaitée dans Charles Proxy
  4. Clic droit sur demande dans Charles Proxy
  5. Sélectionnez 'Copier la requête cURL'

Copy cURL Request example in Charles 3.10.2

Vous avez maintenant une demande cURL que vous pouvez exécuter dans un terminal qui reflétera la demande faite par votre navigateur. Voici à quoi ressemblait ma demande sur cette page (sans l'en-tête du cookie):

curl -H "Host: stackoverflow.com" -H "Cache-Control: max-age=0" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "HTTPS: 1" -H "DNT: 1" -H "Referer: https://www.google.com/" -H "Accept-Language: en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4" -H "If-Modified-Since: Thu, 23 Jul 2015 20:31:28 GMT" --compressed http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome
87
Mike Grace

Ouvrez Chrome Outils de développement, allez dans l'onglet Réseau, faites votre demande (vous devrez peut-être cocher "Conserver le journal" si la page est actualisée). Recherchez la demande à gauche, cliquez avec le bouton droit de la souris, " Copier comme cURL ".

15
hoodslide

Vérifiez les en-têtes HTTP que chrome envoie avec la demande (avec l'extension de navigateur ou le proxy)), puis essayez d'envoyer les mêmes en-têtes avec CURL - éventuellement un à la fois jusqu'à ce que vous trouviez le ou les en-têtes. fait fonctionner la demande.

curl -A [utilisateur-agent] -H [en-têtes] " http://something.com/api "

4
MegaAppBear