Quiero ver los encabezados de solicitud realizados curl
cuando estoy enviando una solicitud al servidor. ¿Cómo puedo verificar eso?
Quiero ver los encabezados de solicitud realizados curl
cuando estoy enviando una solicitud al servidor. ¿Cómo puedo verificar eso?
Respuestas:
Creo que curl -v
es lo más fácil. Escupirá los encabezados de solicitud (líneas con el prefijo '>') sin tener que escribir en un archivo:
$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/
* About to connect() to stackoverflow.com port 80 (#0)
* Trying 69.59.196.211... connected
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS
> Host: stackoverflow.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...
curl -Ivs http://example.com > /dev/null
: -I
para una HEAD
solicitud, -v
para mostrar encabezados enviados, -s
para ocultar la barra de progreso, > /dev/null
para mostrar solo la salida -v, evitando la duplicación.
-D -
estaba ordenado, pero no fue útil para mí, ya que simplemente duplicaba los encabezados que -v
ya se mostraban. Si desea que no estén prefijados para el consumo automático de la máquina, tal vez sería mejor en ese caso, pero solo quería vislumbrar cuál era el problema con más detalle.
curl -v https://www.example.com
; segundo, también imprime la CONNECT
solicitud si está visitando el sitio a través del proxy HTTP , como curl --proxy my-proxy:8080 http://www.example.com
. Creo que ayudaría a más usuarios si se mencionan algunos ejemplos de estas dos características en esta respuesta.
-I
En el mundo moderno, cuando las personas preguntan sobre ver encabezados, probablemente estén hablando de API. Y si usa esa -I
mentalidad de "Yo uso para ver los encabezados con mi servidor web Apache", perderá mucho tiempo desarrollando un HEAD
método que probablemente quiera usar GET
. Deja de decirle a la gente que use -I
. Si lo desean HEAD
, use -X HEAD
(TWSS)
La pregunta no especificaba si el comando de línea de comando nombrado curl
era la biblioteca completa de cURL.
El siguiente código PHP que usa la biblioteca cURL usa el primer parámetro como método HTTP (por ejemplo, "GET", "POST", "OPTIONS") y el segundo parámetro como URL.
<?php
$ch = curl_init();
$f = tmpfile(); # will be automatically removed after fclose()
curl_setopt_array($ch, array(
CURLOPT_CUSTOMREQUEST => $argv[1],
CURLOPT_URL => $argv[2],
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_VERBOSE => 1,
CURLOPT_HEADER => 0,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_STDERR => $f,
));
$response = curl_exec($ch);
fseek($f, 0);
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log
fclose($f);
curl_close($ch);
echo $response;
Ejemplo de uso:
php curl-test.php OPTIONS https://google.com
Tenga en cuenta que los resultados son casi idénticos a la siguiente línea de comando
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
y CURLOPT_FILE
están vacíos.
php?
La única forma en que pude ver mis encabezados salientes (curl con php) fue usando las siguientes opciones:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
Obteniendo su información de depuración:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
devolverá los encabezados de respuesta, así como el cuerpo de respuesta. Var_dump curl_getinfo($ch)
le dará los encabezados de solicitud.
CURLOPT_HEADER
es el encabezado de respuesta: CURLINFO_HEADER_OUT
es el encabezado de la solicitud. Esto es lo que el OP está pidiendo :)
La --trace-ascii
opción de curl mostrará los encabezados de solicitud, así como los encabezados de respuesta y el cuerpo de respuesta.
Por ejemplo, el comando
curl --trace-ascii curl.trace http://www.google.com/
produce un archivo curl.trace
que comienza de la siguiente manera:
== Info: About to connect() to www.google.com port 80 (#0)
== Info: Trying 209.85.229.104... == Info: connected
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0)
=> Send header, 145 bytes (0x91)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3
0050: OpenSSL/0.9.7l zlib/1.2.3
006c: Host: www.google.com
0082: Accept: */*
008f:
También recibió una respuesta (una respuesta 302, para ser precisos pero irrelevantes) que se registró.
Si solo desea guardar los encabezados de respuesta , use la --dump-header
opción:
curl -D file url
curl --dump-header file url
Si necesita más información sobre las opciones disponibles, úsela curl --help | less
(produce unas doscientas líneas de salida pero menciona muchas opciones). O busque la página del manual donde hay más explicaciones de lo que significan las opciones.
curl --trace-ascii {filename} o use un solo guión en lugar del nombre del archivo para enviarlo a stdout:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION si estás usando libcurl
Esto muestra todo lo que curl envía y recibe, con información adicional incluida.
Intenté las respuestas aquí y descubrí que la más útil y fácil aún no figura como respuesta, pero es:
curl -v https://example.com/path
Esto imprime los encabezados de SOLICITUD , así como los encabezados de RESPUESTA, además de otros útiles, como el certificado SSL y si se reutilizó una conexión TCP existente. la -v
bandera se puede combinar con otras banderas, por supuesto, como seguir redirecciones y solicitar autenticación HTTP:
curl -vL --user my_username https://example.com/path
Espero que esto ayude.
Un comando como el siguiente mostrará tres secciones: encabezados de solicitud, encabezados de respuesta y datos (separados por CRLF). Evita la información técnica y el ruido sintáctico agregado por curl.
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
El comando producirá el siguiente resultado:
GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>
Descripción:
-vs
- agregue encabezados (-v) pero elimine la barra de progreso (-s)2>&1
- combina stdout y stderr en stdout simplesed
- Edite la respuesta producida por curl utilizando los siguientes comandos/^* /d
- eliminar líneas que comienzan con '*' (información técnica)/bytes data]$/d
- eliminar líneas que terminan con 'datos de bytes]' (información técnica)s/> //
- eliminar el prefijo '>'s/< //
- eliminar el prefijo '<'Sé que es un poco tarde, pero mi método preferido para hacerlo es netcat
, ya que obtienes exactamente lo que curl
enviaste; esto puede diferir de las opciones --trace
u --trace-ascii
que no mostrarán caracteres que no sean ASCII correctamente (solo se muestran como puntos o necesitan ser decodificados).
Puede hacer esto tan fácilmente abriendo dos ventanas de terminal, en el primer tipo:
nc -l localhost 12345
Esto abre un proceso de escucha en el puerto 12345 de su máquina local.
En la segunda ventana de terminal, ingrese su comando curl, por ejemplo:
curl --form 'foo=bar' localhost:12345
En la primera ventana de terminal verá exactamente qué rizo se envió en la solicitud.
Ahora, por supuesto nc
, no enviará nada en respuesta (a menos que lo escriba usted mismo), por lo que deberá interrumpir el comando curl (control-c) y repetir el proceso para cada prueba.
Sin embargo, esta es una opción útil para simplemente depurar su solicitud, ya que no está involucrando un viaje de ida y vuelta a ninguna parte, o produciendo solicitudes falsas e iterativas en algún lugar hasta que lo haga correctamente; una vez que estés satisfecho con el comando, simplemente redirígelo a una URL válida y listo.
También puede hacer lo mismo para cualquier biblioteca de cURL, simplemente edite su solicitud para señalar al nc
oyente local hasta que esté satisfecho con ella.
volcar los encabezados en un archivo y la carga útil de la respuesta en un archivo diferente
curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt
curl -s -v -o / dev / null -H "Testheader: test" http://www.example.com
También puede usar la -I
opción si desea enviar una solicitud HEAD y no una solicitud GET.
Aquí está mi cliente http en php para hacer consultas posteriores con cookies incluidas:
function http_login_client($url, $params = "", $cookies_send = "" ){
// Vars
$cookies = array();
$headers = getallheaders();
// Perform a http post request to $ur1 using $params
$ch = curl_init($url);
$options = array( CURLOPT_POST => 1,
CURLINFO_HEADER_OUT => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => 1,
CURLOPT_COOKIE => $cookies_send,
CURLOPT_USERAGENT => $headers['User-Agent']
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
/// DEBUG info echo $ respuesta; var_dump (curl_getinfo ($ ch)); ///
// Parse response and read cookies
preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches);
// Build an array with cookies
foreach( $matches[1] as $index => $cookie )
$cookies[$cookie] = $matches[2][$index];
return $cookies;
} // end http_login_client
Puedes verlo usando -iv
$> curl -ivH "apikey:ad9ff3d36888957" --form "file=@/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image
Realice una solicitud de muestra a https://http-tools.appspot.com/reflect-http-request/some-unique-id y verifique qué contiene esta solicitud (encabezado de solicitud, cuerpo de solicitud, parámetros de solicitud) por su correspondiente URL de buscador https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Puede usar cualquier cadena en lugar de some-unique-id
, consulte https://http-tools.appspot.com para obtener más detalles.