ฉันต้องการที่จะเห็นส่วนหัวคำขอทำโดยcurl
เมื่อฉันส่งคำขอไปยังเซิร์ฟเวอร์ ฉันจะตรวจสอบสิ่งนั้นได้อย่างไร
ฉันต้องการที่จะเห็นส่วนหัวคำขอทำโดยcurl
เมื่อฉันส่งคำขอไปยังเซิร์ฟเวอร์ ฉันจะตรวจสอบสิ่งนั้นได้อย่างไร
คำตอบ:
ฉันคิดว่าcurl -v
เป็นวิธีที่ง่ายที่สุด มันจะคายส่วนหัวคำขอ (บรรทัดนำหน้าด้วย '>') โดยไม่ต้องเขียนไฟล์:
$ 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
สำหรับHEAD
คำขอ-v
เพื่อแสดงส่วนหัวที่ถูกส่ง, -s
เพื่อซ่อนแถบความคืบหน้า, > /dev/null
เพื่อแสดงเฉพาะเอาต์พุต -v, หลีกเลี่ยงการทำซ้ำ
-D -
เรียบร้อย แต่ไม่มีประโยชน์สำหรับฉันเพราะมันทำซ้ำส่วนหัวที่-v
แสดงอยู่แล้ว หากคุณต้องการให้พวกเขาไม่ได้เตรียมการสำหรับการใช้งานเครื่องอัตโนมัติอาจจะดีกว่าในกรณีนั้น แต่ฉันอยากเห็นว่าปัญหามีรายละเอียดมากขึ้นเพียงใด
curl -v https://www.example.com
; ที่สองก็ยังพิมพ์CONNECT
คำขอถ้าคุณกำลังเยี่ยมชมเว็บไซต์ผ่านพร็อกซี HTTPcurl --proxy my-proxy:8080 http://www.example.com
เช่น ฉันเชื่อว่ามันจะช่วยให้ผู้ใช้มากขึ้นหากมีการกล่าวถึงตัวอย่างของคุณสมบัติทั้งสองนี้ในคำตอบนี้
-I
ในโลกสมัยใหม่เมื่อผู้คนถามเกี่ยวกับการดูส่วนหัวพวกเขาอาจกำลังพูดถึง API และถ้าคุณใช้ว่า "ผมใช้-I
จะเห็นส่วนหัวกับ Apache เว็บเซิร์ฟเวอร์ของฉัน" ความคิดคุณจะเสียเวลามากกับการพัฒนาวิธีการเมื่อคุณอาจจะหมายถึงการใช้งานHEAD
หยุดบอกคนที่จะใช้GET
-I
หากพวกเขาต้องการHEAD
ใช้-X HEAD
(TWSS)
คำถามไม่ได้ระบุว่าคำสั่งบรรทัดคำสั่งที่ตั้งชื่อcurl
นั้นมีความหมายหรือไลบรารี cURL ทั้งหมด
โค้ด PHP ต่อไปนี้ที่ใช้ไลบรารี cURL ใช้พารามิเตอร์แรกเป็นวิธี HTTP (เช่น "GET", "POST", "OPTIONS") และพารามิเตอร์ที่สองเป็น 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;
ตัวอย่างการใช้งาน:
php curl-test.php OPTIONS https://google.com
โปรดทราบว่าผลลัพธ์เกือบเหมือนกันกับบรรทัดคำสั่งต่อไปนี้
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
และCURLOPT_FILE
ว่างเปล่า
php?
วิธีเดียวที่ฉันจัดการเพื่อดูส่วนหัวขาออก (curl with php) ของฉันคือการใช้ตัวเลือกต่อไปนี้:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
รับข้อมูลการดีบักของคุณ:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
จะส่งคืนส่วนหัวการตอบสนองเช่นเดียวกับส่วนการตอบสนอง var_dump curl_getinfo($ch)
จะให้ส่วนหัวคำขอแก่คุณ
CURLOPT_HEADER
คือส่วนหัวการตอบสนอง - CURLINFO_HEADER_OUT
เป็นส่วนหัวคำขอ นี่คือสิ่งที่สหกรณ์จะขอ :)
--trace-ascii
ตัวเลือกที่จะขดจะแสดงส่วนหัวคำขอเช่นเดียวกับส่วนหัวของการตอบสนองและการตอบสนองของร่างกาย
ตัวอย่างเช่นคำสั่ง
curl --trace-ascii curl.trace http://www.google.com/
สร้างไฟล์curl.trace
ที่เริ่มต้นดังนี้:
== 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:
นอกจากนี้ยังได้รับการตอบกลับ (การตอบสนอง 302 รายการให้แม่นยำ แต่ไม่เกี่ยวข้อง) ซึ่งถูกบันทึกไว้
หากคุณต้องการบันทึกเฉพาะส่วนหัวการตอบสนองให้ใช้--dump-header
ตัวเลือก:
curl -D file url
curl --dump-header file url
หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกที่มีให้ใช้curl --help | less
(มันจะสร้างเอาต์พุตสองร้อยบรรทัด หรือค้นหาหน้าคู่มือที่มีคำอธิบายเพิ่มเติมเกี่ยวกับความหมายของตัวเลือก
curl --trace-ascii {filename} หรือใช้เครื่องหมายขีดกลางแทนชื่อไฟล์เพื่อให้ส่งไปยัง stdout:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTIONหากคุณใช้ libcurl
สิ่งนี้แสดงให้คุณเห็นทุกสิ่งที่ curl ส่งและรับพร้อมกับข้อมูลพิเศษบางอย่างถูกส่งเข้ามา
ฉันลองคำตอบที่นี่และพบว่าคำตอบที่มีประโยชน์และง่ายที่สุดยังไม่ปรากฏเป็นคำตอบ แต่มันคือ:
curl -v https://example.com/path
สิ่งนี้จะพิมพ์ส่วนหัวคำขอรวมทั้งRESPONSEส่วนหัวรวมถึงประโยชน์อื่น ๆ เช่น SSL Cert และการเชื่อมต่อ TCP ที่มีอยู่นั้นถูกนำมาใช้ซ้ำหรือไม่ แน่นอนว่า-v
สามารถใช้การรวมกับค่าสถานะอื่น ๆ ได้เช่นเพื่อติดตามการเปลี่ยนเส้นทางและการแจ้งเตือนสำหรับการตรวจสอบ HTTP:
curl -vL --user my_username https://example.com/path
หวังว่านี่จะช่วยได้
คำสั่งเช่นด้านล่างจะแสดงสามส่วน ได้แก่ ส่วนหัวคำขอส่วนหัวตอบกลับและข้อมูล (คั่นด้วย CRLF) มันหลีกเลี่ยงข้อมูลทางเทคนิคและเสียงรบกวนทางไวยากรณ์ที่เพิ่มโดย curl
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
คำสั่งจะสร้างผลลัพธ์ต่อไปนี้:
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>
รายละเอียด:
-vs
- เพิ่มส่วนหัว (-v) แต่ลบแถบความคืบหน้า (-s)2>&1
- รวม stdout และ stderr เป็น stdout เดียวsed
- แก้ไขคำตอบที่สร้างโดย curl โดยใช้คำสั่งด้านล่าง/^* /d
- ลบบรรทัดที่ขึ้นต้นด้วย '*' (ข้อมูลทางเทคนิค)/bytes data]$/d
- ลบบรรทัดที่ลงท้ายด้วย 'ข้อมูลไบต์]' (ข้อมูลทางเทคนิค)s/> //
- ลบคำนำหน้า '>'s/< //
- ลบคำนำหน้า '<'ฉันรู้ว่านี่มันช้าไปหน่อย แต่วิธีที่ฉันชอบในการทำเช่นนี้คือnetcat
เมื่อคุณได้สิ่งที่curl
ส่งมาอย่างแน่นอน สิ่งนี้อาจแตกต่างจาก--trace
หรือ--trace-ascii
ตัวเลือกตัวเลือกที่จะไม่แสดงอักขระที่ไม่ใช่ ASCII อย่างถูกต้อง (แสดงเป็นจุดหรือจำเป็นต้องถอดรหัส)
คุณสามารถทำได้อย่างง่ายดายโดยเปิดหน้าต่างเทอร์มินัลสองหน้าต่างในประเภทแรก:
nc -l localhost 12345
นี่เป็นการเปิดกระบวนการรับฟังที่พอร์ต 12345 ของเครื่องท้องถิ่นของคุณ
ในหน้าต่างเทอร์มินัลที่สองป้อนคำสั่ง curl ของคุณตัวอย่างเช่น:
curl --form 'foo=bar' localhost:12345
ในหน้าต่าง terminal แรกที่คุณจะเห็นว่าสิ่งที่ขดส่งในคำขอ
แน่นอนตอนนี้ nc
จะไม่ส่งคำตอบใด ๆ (เว้นแต่คุณจะพิมพ์ด้วยตัวเอง) ดังนั้นคุณจะต้องขัดจังหวะคำสั่ง curl (control-c) และทำซ้ำขั้นตอนสำหรับการทดสอบแต่ละครั้ง
อย่างไรก็ตามนี่เป็นตัวเลือกที่มีประโยชน์สำหรับการดีบักคำขอของคุณเนื่องจากคุณไม่ได้เกี่ยวข้องกับการเดินทางไปกลับไม่ว่าจะที่ใดหรือผลิตเป็นการหลอกลวงคำขอซ้ำ ๆ ที่ไหนสักแห่งจนกว่าคุณจะทำถูกต้อง เมื่อคุณพอใจกับคำสั่งแล้วเพียงแค่เปลี่ยนเส้นทางไปยัง URL ที่ถูกต้องแล้วคุณก็พร้อมที่จะไป
คุณสามารถทำเช่นเดียวกันกับไลบรารี cURL ใดก็ได้เช่นกันเพียงแก้ไขคำขอของคุณเพื่อชี้ไปที่nc
ผู้ฟังในพื้นที่จนกว่าคุณจะพอใจ
ดัมพ์ส่วนหัวในไฟล์เดียวและเพย์โหลดของการตอบกลับในไฟล์อื่น
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
คุณสามารถใช้-I
ตัวเลือกหากคุณต้องการส่งคำขอ HEAD ไม่ใช่คำขอ GET
นี่คือไคลเอนต์ http ของฉันใน php เพื่อทำการโพสต์ข้อความค้นหาที่มีคุกกี้อยู่
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 สะท้อนการตอบสนอง $; 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
คุณสามารถดูได้โดยใช้ -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
ส่งคำขอตัวอย่างไปที่https://http-tools.appspot.com/reflect-http-request/some-unique-idและตรวจสอบว่าคำขอนี้มีอะไรบ้าง (ส่วนหัวคำขอเนื้อหาคำขอคำขอพารามิเตอร์) โดย url finder https ที่สอดคล้องกัน: //http-tools.appspot.com/reflect-http-request-finder/some-unique-id คุณสามารถใช้สตริงใด ๆ แทนsome-unique-id
ตรวจสอบhttps://http-tools.appspot.comสำหรับรายละเอียดเพิ่มเติม