Como posso ver os cabeçalhos de solicitação criados por curl ao enviar uma solicitação ao servidor?


Respostas:


501

Eu acho que curl -vé o mais fácil. Ele cuspirá os cabeçalhos da solicitação (linhas prefixadas com '>') sem precisar gravar em um arquivo:

$ 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
...

58
onda -v -D - stackoverflow.com -o / dev / null (para não exibir o conteúdo do site inteiro, apenas cabeçalhos)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Ipara uma HEADsolicitação, -vmostrar cabeçalhos enviados, -socultar a barra de progresso, > /dev/nullmostrar apenas a saída -v, evitando duplicação.
aqui

O @PiotrekDe -D -foi legal, mas não foi útil para mim, pois simplesmente duplicava os cabeçalhos que -vjá eram exibidos. Se você deseja que eles não sejam fixos para o consumo automatizado de máquinas, talvez seja melhor nesse caso, mas eu só queria vislumbrar o problema em mais detalhes.
Pysis

1
Existem dois recursos muito úteis do sinalizador "detalhado": primeiro, ele também imprime o processo de handshake TLS ao acessar o site por HTTPS, como curl -v https://www.example.com; segundo, também imprime a CONNECTsolicitação se você estiver visitando o site por meio de proxy HTTP , como curl --proxy my-proxy:8080 http://www.example.com. Acredito que ajudaria mais usuários se alguns exemplos desses dois recursos forem mencionados nesta resposta.
Franklin Yu

1
TL; DR: não use-I No mundo moderno, quando as pessoas perguntam sobre a exibição de cabeçalhos, provavelmente estão falando sobre APIs. E se você usar a -Imentalidade "Eu uso para ver os cabeçalhos com meu servidor da web Apache", você perderá muito tempo desenvolvendo um HEADmétodo quando provavelmente pretende usá-lo GET. Pare de dizer para as pessoas usarem -I. Se eles querem HEAD, o uso -X HEAD(TWSS)
de Bruno Bronosky

141

A pergunta não especificou se o comando da linha de comandos com o nome curlpretendia ou se toda a biblioteca cURL.

O código PHP a seguir, usando a biblioteca cURL, usa o primeiro parâmetro como método HTTP (por exemplo, "GET", "POST", "OPTIONS") e o 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;

Exemplo de uso:

php curl-test.php OPTIONS https://google.com

Observe que os resultados são quase idênticos aos da seguinte linha de comando

curl -v -s -o - -X OPTIONS https://google.com

Essa é a melhor resposta, porque o arquivo usado neste método contém tudo em curl_getinfo () mencionado abaixo, além de mais detalhes sobre a solicitação e a resposta.
Mike_K

3
Você pode usar CURLOPT_WRITEHEADER para as informações do cabeçalho e CURLOPT_FILE para toda a transferência
sturrockad

1
Lembre-se de que, se a conexão for recusada, os arquivos que foram especificados CURLOPT_WRITEHEADER e CURLOPT_FILEestão vazios.
eithed

34
Quem disse alguma coisa sobre o usophp?
Eddie B

1
Votou sua resposta porque, enquanto a pergunta não estava relacionada ao php, sua resposta com base em php me indicou a direção certa para resolver meu próprio problema com o envio de um token de portador. Obrigado. Eu declarei minha razão aqui apenas na tentativa vã de fazer com que essa pergunta apareça nas pesquisas futuras do Google por desenvolvedores php com um problema semelhante.
26419 Chris

49

A única maneira de conseguir ver meus cabeçalhos de saída (enrolar com php) era usando as seguintes opções:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

Obtendo suas informações de depuração:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));

1
Para mim, isso parecia ser o cabeçalho de resposta, não o cabeçalho de saída.
Toby

3
var_dump $dataretornará os cabeçalhos de resposta, bem como o corpo da resposta. O var_dump curl_getinfo($ch)fornecerá os cabeçalhos da solicitação.
Jrgns

2
CURLOPT_HEADERé o cabeçalho da resposta - CURLINFO_HEADER_OUTé o cabeçalho da solicitação. Isto é o que o OP está pedindo :)
Richard Parnaby-King

44

A --trace-asciiopção de enrolar mostrará os cabeçalhos da solicitação, bem como os cabeçalhos de resposta e o corpo da resposta.

Por exemplo, o comando

curl --trace-ascii curl.trace http://www.google.com/ 

produz um arquivo curl.traceque inicia da seguinte maneira:

== 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: 

Também obteve uma resposta (uma resposta 302, para ser precisa, mas irrelevante) que foi registrada.


Se você deseja salvar apenas os cabeçalhos de resposta , use a --dump-headeropção:

curl -D file url
curl --dump-header file url

Se você precisar de mais informações sobre as opções disponíveis, use curl --help | less(ele produz algumas centenas de linhas de saída, mas menciona muitas opções). Ou encontre a página do manual onde há mais explicações sobre o significado das opções.


10
-D fornece os cabeçalhos de resposta (como -I, mas com STDIN). A pergunta fazia os cabeçalhos da solicitação .
Pr1001

34

curl --trace-ascii {filename} ou use um único traço em vez do nome do arquivo para enviá-lo ao stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION se você estiver usando libcurl

Isso mostra tudo o que o curl envia e recebe, com algumas informações extras.


1
Isso é muito detalhado, mas certamente mostra tudo o que você precisa saber.
tripleee

27

Tentei as respostas aqui e descobri que a mais útil e mais fácil ainda não está listada como resposta, mas é:

curl -v https://example.com/path

Isso imprime os cabeçalhos PEDIDO , bem como os cabeçalhos RESPONSE, além de outros úteis, como o certificado SSL, e se uma conexão TCP existente foi reutilizada. o -vsinalizador pode ser combinado com outros sinalizadores, é claro, como seguir redirecionamentos e solicitar autenticação HTTP:

curl -vL --user my_username https://example.com/path

Espero que isto ajude.


2
Está listado no lugar mais alto
Pmpr 9/16

19

Um comando como o abaixo mostrará três seções: cabeçalhos de solicitação, cabeçalhos de resposta e dados (separados por CRLF). Evita informações técnicas e ruídos sintáticos adicionados pelo curl.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

O comando produzirá a seguinte saída:

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>

Descrição:

  • -vs - adicione cabeçalhos (-v) mas remova a barra de progresso (-s)
  • 2>&1 - combine stdout e stderr em stdout único
  • sed - editar resposta produzida por curl usando os comandos abaixo
  • /^* /d - remova linhas começando com '*' (informações técnicas)
  • /bytes data]$/d - remover linhas que terminam com 'bytes data]' (informações técnicas)
  • s/> // - remova o prefixo '>'
  • s/< // - remova o prefixo '<'

11

Eu sei que é um pouco tarde, mas meu método preferido para fazer isso é netcat, pois você recebe exatamente o que foi curlenviado; isso pode diferir das opções --traceou --trace-asciique não mostram caracteres não-ASCII corretamente (eles apenas aparecem como pontos ou precisam ser decodificados).

Você pode fazer isso com muita facilidade abrindo duas janelas de terminal, no primeiro tipo:

nc -l localhost 12345

Isso abre um processo de escuta na porta 12345 da sua máquina local.

Na segunda janela do terminal, digite seu comando curl, por exemplo:

curl --form 'foo=bar' localhost:12345

Na primeira janela do terminal, você verá exatamente qual onda foi enviada na solicitação.

Agora, é claro nc, não enviará nada em resposta (a menos que você o digite), portanto, você precisará interromper o comando curl (control-c) e repetir o processo para cada teste.

No entanto, essa é uma opção útil para simplesmente depurar sua solicitação, pois você não envolve uma viagem de ida e volta a lugar nenhum ou produz solicitações falsas e iterativas em algum lugar até que você acerte; Quando estiver satisfeito com o comando, basta redirecioná-lo para um URL válido e pronto.

Você também pode fazer o mesmo em qualquer biblioteca cURL; basta editar sua solicitação para apontar para o ncouvinte local até que você esteja feliz com isso.


6

despejar os cabeçalhos em um arquivo e a carga da resposta em um arquivo diferente

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt

5
curl -s -v -o / dev / null -H "Cabeçalho de teste: teste" http://www.example.com

Você também pode usar a -Iopção se desejar enviar uma solicitação HEAD e não uma solicitação GET.


3

Aqui está o meu cliente http no php para fazer consultas postadas com cookies incluídos:

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);

/// info DEBUG echo $ response; 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

3

Você pode vê-lo 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

1

Você pode usar o wireshark ou o tcpdump para procurar qualquer tráfego de rede (http também).


11
se a carga útil for sobre HTTPS, eles serão inúteis sem um proxy ou monitor de camada de aplicativo.
P00ya

1

Faça uma solicitação de amostra para https://http-tools.appspot.com/reflect-http-request/some-unique-id e verifique o que esta solicitação contém (cabeçalho da solicitação, corpo da solicitação, parâmetros da solicitação) pelo URL localizador correspondente https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Você pode usar qualquer string em vez de some-unique-id, confira https://http-tools.appspot.com para obter mais detalhes.


1
Obrigado, embora não esteja exatamente respondendo à pergunta, é exatamente isso que eu precisava. O dispositivo A faz uma solicitação, o dispositivo B verifica se uma solicitação foi feita.
Domen 03/07
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.