Làm cách nào tôi có thể thấy các tiêu đề yêu cầu được tạo bởi curl khi gửi yêu cầu đến máy chủ?


Câu trả lời:


501

Tôi nghĩ curl -vlà dễ nhất. Nó sẽ nhổ ra các tiêu đề yêu cầu (dòng có tiền tố '>') mà không phải ghi vào tệp:

$ 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
curl -v -D - stackoverflow.com -o / dev / null (để không hiển thị toàn bộ nội dung của trang web, chỉ là các tiêu đề)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Icho một HEADyêu cầu, -vđể hiển thị các tiêu đề đã gửi, -sđể ẩn thanh tiến trình, > /dev/nullchỉ hiển thị đầu ra -v, tránh trùng lặp.
ở đây

@PiotrekDe -D -rất gọn gàng, nhưng không hữu ích với tôi vì nó chỉ đơn giản là sao chép các tiêu đề -vđã được hiển thị. Nếu bạn muốn chúng không được chuẩn bị cho mức tiêu thụ máy tự động, thì có lẽ nó sẽ tốt hơn trong trường hợp đó, nhưng tôi chỉ muốn nhìn thoáng qua vấn đề là chi tiết hơn.
Pysis

1
Có hai tính năng rất hữu ích của cờ "dài dòng": đầu tiên, nó cũng in quy trình bắt tay TLS khi truy cập trang web thông qua HTTPS, chẳng hạn như curl -v https://www.example.com; thứ hai, nó cũng in CONNECTyêu cầu nếu bạn đang truy cập trang web thông qua proxy HTTP , chẳng hạn như curl --proxy my-proxy:8080 http://www.example.com. Tôi tin rằng nó sẽ giúp nhiều người dùng hơn nếu một số ví dụ về hai tính năng này được đề cập trong câu trả lời này.
Franklin Yu

1
TL; DR: Không sử dụng-I Trong thế giới hiện đại, khi mọi người hỏi về việc xem các tiêu đề, có lẽ họ đang nói về API. Và nếu bạn sử dụng tâm lý "Tôi sử dụng -Iđể xem các tiêu đề với máy chủ web Apache của tôi", bạn sẽ lãng phí rất nhiều thời gian để phát triển theo một HEADphương pháp khi bạn có thể sử dụng GET. Ngừng nói với mọi người để sử dụng -I. Nếu họ muốn HEAD, hãy sử dụng -X HEAD(TWSS)
Bruno Bronosky

141

Câu hỏi không chỉ định nếu lệnh dòng lệnh có tên curllà hoặc toàn bộ thư viện cURL.

Mã PHP sau khi sử dụng thư viện cURL sử dụng tham số đầu tiên làm phương thức HTTP (ví dụ: "GET", "POST", "TÙY CHỌN") và tham số thứ hai làm 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;

Ví dụ sử dụng:

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

Lưu ý rằng các kết quả gần giống với dòng lệnh sau

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

Đây là câu trả lời tốt nhất, vì tệp được sử dụng trong phương thức này chứa mọi thứ trong curl_getinfo () được tham chiếu bên dưới, cùng với nhiều chi tiết hơn về cả yêu cầu và phản hồi.
Mike_K

3
Bạn có thể sử dụng CURLOPT_WRITEHEADER cho thông tin tiêu đề và CURLOPT_FILE cho toàn bộ chuyển khoản
sturrockad

1
Hãy nhớ rằng nếu kết nối bị từ chối, các tệp đã được chỉ định CURLOPT_WRITEHEADER CURLOPT_FILEtrống.

34
Ai nói bất cứ điều gì về việc sử dụngphp?
Eddie B

1
Tôi đã đưa ra câu trả lời của bạn bởi vì trong khi câu hỏi không liên quan đến php, câu trả lời dựa trên php của bạn đã chỉ cho tôi đi đúng hướng để giải quyết vấn đề của riêng tôi bằng cách gửi mã thông báo mang. Cảm ơn bạn. Tôi đã nêu lý do của tôi ở đây chỉ trong nỗ lực vô ích để có câu hỏi này xuất hiện trong các tìm kiếm google trong tương lai cho các nhà phát triển php có vấn đề tương tự.
Chris

49

Cách duy nhất tôi quản lý để xem các tiêu đề gửi đi của mình (curl với php) là sử dụng các tùy chọn sau:

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

Nhận thông tin gỡ lỗi của bạn:

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

1
Đối với tôi đó dường như là tiêu đề phản hồi chứ không phải tiêu đề đi.
Toby

3
var_dump $datasẽ trả về các tiêu đề phản hồi cũng như cơ quan phản hồi. Var_dump curl_getinfo($ch)sẽ cung cấp cho bạn các tiêu đề yêu cầu.
Ngày

2
CURLOPT_HEADERlà tiêu đề phản hồi - CURLINFO_HEADER_OUTlà tiêu đề yêu cầu. Đây là những gì OP đang yêu cầu :)
Richard Parnaby-King

44

Các --trace-asciitùy chọn để curl sẽ hiển thị tiêu đề yêu cầu, cũng như các tiêu đề phản ứng và phản ứng cơ thể.

Ví dụ: lệnh

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

tạo một tập tin curl.tracebắt đầu như sau:

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

Nó cũng nhận được phản hồi (phản hồi 302, chính xác nhưng không liên quan) đã được ghi lại.


Nếu bạn chỉ muốn lưu các tiêu đề phản hồi , hãy sử dụng --dump-headertùy chọn:

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

Nếu bạn cần thêm thông tin về các tùy chọn có sẵn, hãy sử dụng curl --help | less(nó tạo ra vài trăm dòng đầu ra nhưng đề cập đến rất nhiều tùy chọn). Hoặc tìm trang hướng dẫn nơi có nhiều giải thích về ý nghĩa của các tùy chọn.


10
-D cung cấp cho bạn các tiêu đề phản hồi (cũng như -I, nhưng với STDIN). Câu hỏi yêu cầu cho các tiêu đề yêu cầu .
pr1001

34

curl --trace-ascii {tên tệp} hoặc sử dụng một dấu gạch ngang thay vì tên tệp để gửi nó đến thiết bị xuất chuẩn:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION nếu bạn đang sử dụng libcurl

Điều này cho bạn thấy mọi thứ mà curl gửi và nhận, với một số thông tin bổ sung được đưa vào.


1
Điều này rất dài dòng, nhưng chắc chắn cho bạn thấy mọi thứ bạn cần biết.
tripleee

27

Tôi đã thử các câu trả lời ở đây và thấy rằng câu trả lời hữu ích và dễ nhất chưa được liệt kê dưới dạng câu trả lời, nhưng đó là:

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

Điều này in ra các tiêu đề YÊU CẦU cũng như các tiêu đề RESPONSE cộng với các hữu ích khác như chứng chỉ SSL và liệu kết nối TCP hiện có có được sử dụng lại hay không. tất nhiên, -vcờ có thể được kết hợp với các cờ khác, chẳng hạn như để theo dõi chuyển hướng và nhắc nhở xác thực HTTP:

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

Hi vọng điêu nay co ich.


2
Nó được liệt kê ở vị trí cao nhất
Pmpr

19

Một lệnh như bên dưới sẽ hiển thị ba phần: tiêu đề yêu cầu, tiêu đề phản hồi và dữ liệu (được phân tách bằng CRLF). Nó tránh thông tin kỹ thuật và tiếng ồn cú pháp được thêm vào bởi curl.

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

Lệnh sẽ tạo đầu ra sau:

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>

Sự miêu tả:

  • -vs - thêm tiêu đề (-v) nhưng xóa thanh tiến trình (-s)
  • 2>&1 - kết hợp thiết bị xuất chuẩn và thiết bị xuất chuẩn thành thiết bị xuất chuẩn duy nhất
  • sed - chỉnh sửa phản hồi được tạo bởi curl bằng các lệnh bên dưới
  • /^* /d - xóa các dòng bắt đầu bằng '*' (thông tin kỹ thuật)
  • /bytes data]$/d - xóa các dòng kết thúc bằng 'byte data]' (thông tin kỹ thuật)
  • s/> // - xóa tiền tố '>'
  • s/< // - xóa tiền tố '<'

11

Tôi biết điều này hơi muộn, nhưng phương pháp ưa thích của tôi để làm điều này là netcat, khi bạn nhận được chính xác những gì curlđã gửi; điều này có thể khác với --tracehoặc --trace-asciicác tùy chọn sẽ không hiển thị đúng các ký tự không phải ASCII (chúng chỉ hiển thị dưới dạng dấu chấm hoặc cần được giải mã).

Bạn có thể làm điều này rất dễ dàng bằng cách mở hai cửa sổ đầu cuối, trong loại đầu tiên:

nc -l localhost 12345

Điều này mở ra một quá trình nghe trên cổng 12345 của máy cục bộ của bạn.

Trong cửa sổ terminal thứ hai, nhập lệnh curl của bạn, ví dụ:

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

Trong cửa sổ đầu cuối đầu tiên, bạn sẽ thấy chính xác những gì curl gửi trong yêu cầu.

Bây giờ tất nhiên ncsẽ không gửi bất cứ điều gì trong phản hồi (trừ khi bạn tự nhập nó), vì vậy bạn sẽ cần phải ngắt lệnh curl (control-c) và lặp lại quy trình cho mỗi bài kiểm tra.

Tuy nhiên, đây là một tùy chọn hữu ích để đơn giản gỡ lỗi yêu cầu của bạn, vì bạn không liên quan đến chuyến đi khứ hồi ở bất cứ đâu hoặc tạo ra các yêu cầu không có thật, lặp đi lặp lại ở đâu đó cho đến khi bạn thực hiện đúng; một khi bạn hài lòng với lệnh, chỉ cần chuyển hướng nó đến một URL hợp lệ và bạn sẽ ổn.

Bạn cũng có thể làm tương tự cho bất kỳ thư viện cURL nào, chỉ cần chỉnh sửa yêu cầu của bạn để trỏ đến ncngười nghe cục bộ cho đến khi bạn hài lòng với nó.


6

kết xuất các tiêu đề trong một tệp và tải trọng của phản hồi trong một tệp khác

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

5
curl -s -v -o / dev / null -H "Người kiểm tra: kiểm tra" http://www.example.com

Bạn cũng có thể sử dụng -Itùy chọn nếu bạn muốn gửi yêu cầu CHÍNH chứ không phải yêu cầu NHẬN.


3

Đây là ứng dụng http của tôi trong php để thực hiện các truy vấn bài đăng có cookie:

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 thông tin echo $ hồi đáp; 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

Bạn có thể nhìn thấy nó bằng cách sử dụng -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

Bạn có thể sử dụng wireshark hoặc tcpdump để xem bất kỳ lưu lượng truy cập mạng nào (http cũng vậy).


11
nếu tải trọng vượt quá HTTPS, những thứ đó sẽ vô dụng nếu không có proxy hoặc trình giám sát lớp ứng dụng.
p00ya

1

Tạo một yêu cầu mẫu tới https://http-tools.appspot.com/reflect-http-request/some-unique-id và kiểm tra xem yêu cầu này chứa gì (tiêu đề yêu cầu, thân yêu cầu, tham số yêu cầu) bằng url tìm kiếm tương ứng của nó https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Bạn có thể sử dụng bất kỳ chuỗi nào thay vì some-unique-id, hãy xem https://http-tools.appspot.com để biết thêm chi tiết.


1
Cảm ơn, trong khi không trả lời chính xác câu hỏi, đây chính xác là những gì tôi cần. Thiết bị A đưa ra yêu cầu, Thiết bị B kiểm tra yêu cầu đã được thực hiện.
domen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.