¿Cómo usar curl para obtener una solicitud GET exactamente igual que usar Chrome?

85

Tengo una API web http://something.com/apiy quiero usar GET para obtener el cuerpo de respuesta.

Este es mi comando:

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

Por supuesto, falla y da un mensaje de error.

Cuando uso Chrome e ingreso la URL anterior, todo es correcto. Sin embargo, hago lo mismo con Firefox, la URL me da el mismo mensaje de error. Intento repetir la acción con la extensión DHC de Chrome, la solicitud vuelve a dar la respuesta correcta. Después de algunas búsquedas, creo que la opción curl --user-agentmarca la diferencia. ¿Cuál es la forma correcta de configurar el agente de usuario en Chrome? ¿O este no es el punto, el problema viene de otros campos? Muchas gracias.

wdetac
fuente

Respuestas:

122

Si necesita configurar la cadena de encabezado del usuario en la solicitud curl, puede usar la -Hopción para configurar el agente de usuario como:

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

El uso de una herramienta proxy como Charles Proxy realmente ayuda a simplificar algo como lo que está preguntando. Esto es lo que hago, usando esta página SO como ejemplo (a partir de julio de 2015 usando Charles versión 3.10):

  1. Haz que Charles Proxy se ejecute
  2. Realizar una solicitud web mediante el navegador
  3. Encuentre la solicitud deseada en Charles Proxy
  4. Haga clic derecho sobre la solicitud en Charles Proxy
  5. Seleccione 'Copiar solicitud cURL'

Copiar ejemplo de solicitud de cURL en Charles 3.10.2

Ahora tiene una solicitud cURL que puede ejecutar en una terminal que reflejará la solicitud que realizó su navegador. Así es como se veía mi solicitud a esta página (con el encabezado de la cookie eliminado):

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
Mike Grace
fuente
Sería mucho mejor si Charles admite la copia / exportación de múltiples solicitudes cURL de una sola vez
más sabio
Algunas API, como ArcGIS, solo respetarán el Accept: text/htmlencabezado para forzar la salida HTML.
sventechie
2
curl -A agent_name es un atajo
ppostma1
23

Abra Chrome Developer Tools, vaya a la pestaña Red, haga su solicitud (es posible que deba verificar "Conservar registro" si la página se actualiza). Busque la solicitud a la izquierda, haga clic con el botón derecho en "Copiar como cURL".

campana
fuente
Pero la cookie en "Copiar como cURL" caduca en pocos minutos. Al menos en el caso de la mayoría de los sitios. ¿Cómo puedo automatizarlo para obtener una nueva cookie?
Gaurav Kansal
6

Verifique los encabezados HTTP que Chrome está enviando con la solicitud (usando la extensión del navegador o proxy) luego intente enviar los mismos encabezados con CURL - Posiblemente uno a la vez hasta que averigüe qué encabezado (s) hace que la solicitud funcione.

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

MegaAppBear
fuente
No estoy familiarizado con eso. ¿Puede darme algunos ejemplos reales para configurar el agente de usuario en Chrome y posibles encabezados?
wdetac