Tôi muốn xem các tiêu đề yêu cầu được thực hiện curl
khi tôi gửi yêu cầu đến máy chủ. Làm thế nào tôi có thể kiểm tra điều đó?
Tôi muốn xem các tiêu đề yêu cầu được thực hiện curl
khi tôi gửi yêu cầu đến máy chủ. Làm thế nào tôi có thể kiểm tra điều đó?
Câu trả lời:
Tôi nghĩ curl -v
là 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
...
curl -Ivs http://example.com > /dev/null
: -I
cho một HEAD
yêu cầu, -v
để hiển thị các tiêu đề đã gửi, -s
để ẩn thanh tiến trình, > /dev/null
chỉ hiển thị đầu ra -v, tránh trùng lặp.
-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.
curl -v https://www.example.com
; thứ hai, nó cũng in CONNECT
yê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.
-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 HEAD
phươ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)
Câu hỏi không chỉ định nếu lệnh dòng lệnh có tên curl
là 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
CURLOPT_WRITEHEADER
và CURLOPT_FILE
trống.
php?
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));
var_dump $data
sẽ 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.
CURLOPT_HEADER
là tiêu đề phản hồi - CURLINFO_HEADER_OUT
là tiêu đề yêu cầu. Đây là những gì OP đang yêu cầu :)
Các --trace-ascii
tù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.trace
bắ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-header
tù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.
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.
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, -v
cờ 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.
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ấtsed
- 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ố '<'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 --trace
hoặc --trace-ascii
cá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 nc
sẽ 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 nc
người nghe cục bộ cho đến khi bạn hài lòng với nó.
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
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 -I
tù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.
Đâ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
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
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.