Quero ver os cabeçalhos de solicitação criados curl
quando estou enviando uma solicitação ao servidor. Como posso verificar isso?
Quero ver os cabeçalhos de solicitação criados curl
quando estou enviando uma solicitação ao servidor. Como posso verificar isso?
Respostas:
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
...
curl -Ivs http://example.com > /dev/null
: -I
para uma HEAD
solicitação, -v
mostrar cabeçalhos enviados, -s
ocultar a barra de progresso, > /dev/null
mostrar apenas a saída -v, evitando duplicação.
-D -
foi legal, mas não foi útil para mim, pois simplesmente duplicava os cabeçalhos que -v
já 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.
curl -v https://www.example.com
; segundo, também imprime a CONNECT
solicitaçã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.
-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 -I
mentalidade "Eu uso para ver os cabeçalhos com meu servidor da web Apache", você perderá muito tempo desenvolvendo um HEAD
método quando provavelmente pretende usá-lo GET
. Pare de dizer para as pessoas usarem -I
. Se eles querem HEAD
, o uso -X HEAD
(TWSS)
A pergunta não especificou se o comando da linha de comandos com o nome curl
pretendia 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
CURLOPT_WRITEHEADER
e CURLOPT_FILE
estão vazios.
php?
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));
var_dump $data
retornará os cabeçalhos de resposta, bem como o corpo da resposta. O var_dump curl_getinfo($ch)
fornecerá os cabeçalhos da solicitação.
CURLOPT_HEADER
é o cabeçalho da resposta - CURLINFO_HEADER_OUT
é o cabeçalho da solicitação. Isto é o que o OP está pedindo :)
A --trace-ascii
opçã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.trace
que 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-header
opçã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.
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.
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 -v
sinalizador 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.
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 únicosed
- 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 '<'Eu sei que é um pouco tarde, mas meu método preferido para fazer isso é netcat
, pois você recebe exatamente o que foi curl
enviado; isso pode diferir das opções --trace
ou --trace-ascii
que 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 nc
ouvinte local até que você esteja feliz com isso.
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
curl -s -v -o / dev / null -H "Cabeçalho de teste: teste" http://www.example.com
Você também pode usar a -I
opção se desejar enviar uma solicitação HEAD e não uma solicitação GET.
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
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
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.