Come utilizzare curl per ottenere una richiesta GET esattamente come usando Chrome?


87

Ho un'API Web http://something.com/apie desidero utilizzare GET per ottenere il corpo della risposta.

Questo è il mio comando:

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

Ovviamente fallisce e fornisce un messaggio di errore.

Quando utilizzo Chrome e inserisco l'URL sopra, tutto è corretto. Comunque faccio le stesse cose con Firefox, l'url mi dà lo stesso messaggio di errore. Provo a ripetere l'azione con l'estensione DHC di Chrome, la richiesta dà nuovamente la risposta corretta. Dopo alcune ricerche, credo che l'opzione curl --user-agentfaccia la differenza. Qual è il modo corretto per impostare lo user agent su Chrome? O non è questo il punto, il problema viene da altri campi? Grazie mille.

Risposte:


123

Se è necessario impostare la stringa di intestazione dell'utente nella richiesta di arricciatura, è possibile utilizzare l' -Hopzione per impostare l'agente utente come:

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'uso di uno strumento proxy come Charles Proxy aiuta davvero a semplificare il lavoro di qualcosa come quello che stai chiedendo. Ecco cosa faccio, utilizzando questa pagina SO come esempio (a partire da luglio 2015 utilizzando la versione 3.10 di Charles):

  1. Ottieni Charles Proxy in esecuzione
  2. Effettua una richiesta web utilizzando il browser
  3. Trova la richiesta desiderata in Charles Proxy
  4. Fare clic con il tasto destro su richiesta in Charles Proxy
  5. Seleziona "Copia richiesta cURL"

Copia l'esempio di richiesta cURL in Charles 3.10.2

Ora hai una richiesta cURL che puoi eseguire in un terminale che rispecchierà la richiesta fatta dal tuo browser. Ecco come appariva la mia richiesta a questa pagina (con l'intestazione del cookie rimossa):

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

Sarebbe molto meglio se Charles supportasse la copia / esportazione di più richieste cURL in una volta sola
più saggio

Alcune API, come ArcGIS, rispetteranno solo l' Accept: text/htmlintestazione per forzare l'output HTML.
sventechie

2
curl -A agent_name è una scorciatoia
ppostma1

26

Apri gli Strumenti per sviluppatori di Chrome, vai alla scheda Rete, fai la tua richiesta (potresti dover selezionare "Preserve Log" se la pagina si aggiorna). Trova la richiesta a sinistra, fai clic con il pulsante destro del mouse su "Copia come cURL".


Ma il cookie in "Copia come cURL" scade entro pochi minuti. Almeno nel caso della maggior parte dei siti. Come posso automatizzarlo per recuperare un nuovo cookie?
Gaurav Kansal

6

Controlla le intestazioni HTTP che Chrome sta inviando con la richiesta (utilizzando l'estensione del browser o il proxy), quindi prova a inviare le stesse intestazioni con CURL, possibilmente una alla volta finché non capisci quale intestazione fa funzionare la richiesta.

curl -A [user-agent] -H [headers] " http://something.com/api "


Non lo conosco. Potete fornirmi alcuni esempi reali per impostare lo user-agent su Chrome e le possibili intestazioni?
wdetac
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.