ฉันจะดูส่วนหัวของคำขอที่ทำโดย curl เมื่อส่งคำขอไปยังเซิร์ฟเวอร์ได้อย่างไร?


485

ฉันต้องการที่จะเห็นส่วนหัวคำขอทำโดยcurlเมื่อฉันส่งคำขอไปยังเซิร์ฟเวอร์ ฉันจะตรวจสอบสิ่งนั้นได้อย่างไร


URL นี้อาจมีประโยชน์ helloacm.com/curl
doctorlai

1
คุณสามารถใช้สิ่งนี้เพื่อทดสอบrun-node.com/now-use-curl-with-http-echo-com
John Williams

คำตอบ:


501

ฉันคิดว่า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
...

58
curl -v -D - stackoverflow.com -o / dev / null (เพื่อไม่ให้แสดงเนื้อหาทั้งหมดของเว็บไซต์เพียงแค่ส่วนหัว)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -IสำหรับHEADคำขอ-vเพื่อแสดงส่วนหัวที่ถูกส่ง, -sเพื่อซ่อนแถบความคืบหน้า, > /dev/nullเพื่อแสดงเฉพาะเอาต์พุต -v, หลีกเลี่ยงการทำซ้ำ
ที่นี่

@PiotrekDe -D -เรียบร้อย แต่ไม่มีประโยชน์สำหรับฉันเพราะมันทำซ้ำส่วนหัวที่-vแสดงอยู่แล้ว หากคุณต้องการให้พวกเขาไม่ได้เตรียมการสำหรับการใช้งานเครื่องอัตโนมัติอาจจะดีกว่าในกรณีนั้น แต่ฉันอยากเห็นว่าปัญหามีรายละเอียดมากขึ้นเพียงใด
Pysis

1
มีคุณสมบัติที่เป็นประโยชน์สองอย่างของการตั้งค่าสถานะ "verbose": ก่อนอื่นมันยังพิมพ์กระบวนการจับมือ TLS เมื่อเข้าถึงเว็บไซต์ผ่าน HTTPS เช่นcurl -v https://www.example.com; ที่สองก็ยังพิมพ์CONNECTคำขอถ้าคุณกำลังเยี่ยมชมเว็บไซต์ผ่านพร็อกซี HTTPcurl --proxy my-proxy:8080 http://www.example.comเช่น ฉันเชื่อว่ามันจะช่วยให้ผู้ใช้มากขึ้นหากมีการกล่าวถึงตัวอย่างของคุณสมบัติทั้งสองนี้ในคำตอบนี้
แฟรงคลินหยู

1
TL; DR: อย่าใช้-Iในโลกสมัยใหม่เมื่อผู้คนถามเกี่ยวกับการดูส่วนหัวพวกเขาอาจกำลังพูดถึง API และถ้าคุณใช้ว่า "ผมใช้-Iจะเห็นส่วนหัวกับ Apache เว็บเซิร์ฟเวอร์ของฉัน" ความคิดคุณจะเสียเวลามากกับการพัฒนาวิธีการเมื่อคุณอาจจะหมายถึงการใช้งานHEAD หยุดบอกคนที่จะใช้GET -Iหากพวกเขาต้องการHEADใช้-X HEAD(TWSS)
บรูโน่บรองโกกี้

141

คำถามไม่ได้ระบุว่าคำสั่งบรรทัดคำสั่งที่ตั้งชื่อ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

นี่คือคำตอบที่ดีที่สุดเนื่องจากไฟล์ที่ใช้ในวิธีนี้มีทุกอย่างใน curl_getinfo () อ้างอิงด้านล่างพร้อมรายละเอียดเพิ่มเติมเกี่ยวกับคำขอและการตอบกลับ
Mike_K

3
คุณสามารถใช้ CURLOPT_WRITEHEADER สำหรับข้อมูลส่วนหัวและ CURLOPT_FILE สำหรับการถ่ายโอนทั้งหมด
sturrockad

1
โปรดจำไว้ว่าหากการเชื่อมต่อถูกปฏิเสธไฟล์ที่ระบุด้วยCURLOPT_WRITEHEADER และCURLOPT_FILEว่างเปล่า
eithed

34
ใครพูดอะไรเกี่ยวกับการใช้php?
Eddie B

1
ฉันยกระดับคำตอบของคุณเพราะในขณะที่คำถามนั้นไม่เกี่ยวข้องกับ php คำตอบจาก php ของคุณชี้ให้ฉันเห็นทิศทางที่ถูกต้องในการแก้ไขปัญหาของฉันเองด้วยการส่งโทเค็นผู้ถือ ขอบคุณ. ฉันระบุเหตุผลของฉันที่นี่เฉพาะในความพยายามอย่างไร้ผลที่จะมีคำถามนี้ปรากฏขึ้นในอนาคต google ค้นหา php devs ด้วยปัญหาที่คล้ายกัน
Chris

49

วิธีเดียวที่ฉันจัดการเพื่อดูส่วนหัวขาออก (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));

1
สำหรับฉันที่ดูเหมือนจะเป็นส่วนหัวการตอบสนองไม่ใช่ส่วนหัวขาออก
Toby

3
var_dump $dataจะส่งคืนส่วนหัวการตอบสนองเช่นเดียวกับส่วนการตอบสนอง var_dump curl_getinfo($ch)จะให้ส่วนหัวคำขอแก่คุณ
Jrgns

2
CURLOPT_HEADERคือส่วนหัวการตอบสนอง - CURLINFO_HEADER_OUTเป็นส่วนหัวคำขอ นี่คือสิ่งที่สหกรณ์จะขอ :)
ริชาร์ดคิง Parnaby

44

--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(มันจะสร้างเอาต์พุตสองร้อยบรรทัด หรือค้นหาหน้าคู่มือที่มีคำอธิบายเพิ่มเติมเกี่ยวกับความหมายของตัวเลือก


10
-D ให้ส่วนหัวการตอบกลับ (เช่นเดียวกับ -I แต่ไปที่ STDIN) คำถามที่ถามสำหรับส่วนหัวของคำขอ
pr1001

34

curl --trace-ascii {filename} หรือใช้เครื่องหมายขีดกลางแทนชื่อไฟล์เพื่อให้ส่งไปยัง stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTIONหากคุณใช้ libcurl

สิ่งนี้แสดงให้คุณเห็นทุกสิ่งที่ curl ส่งและรับพร้อมกับข้อมูลพิเศษบางอย่างถูกส่งเข้ามา


1
นี่เป็นสิ่งที่ละเอียดมาก แต่ก็แสดงให้คุณเห็นทุกสิ่งที่คุณควรรู้
tripleee

26

ฉันลองคำตอบที่นี่และพบว่าคำตอบที่มีประโยชน์และง่ายที่สุดยังไม่ปรากฏเป็นคำตอบ แต่มันคือ:

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

สิ่งนี้จะพิมพ์ส่วนหัวคำขอรวมทั้งRESPONSEส่วนหัวรวมถึงประโยชน์อื่น ๆ เช่น SSL Cert และการเชื่อมต่อ TCP ที่มีอยู่นั้นถูกนำมาใช้ซ้ำหรือไม่ แน่นอนว่า-vสามารถใช้การรวมกับค่าสถานะอื่น ๆ ได้เช่นเพื่อติดตามการเปลี่ยนเส้นทางและการแจ้งเตือนสำหรับการตรวจสอบ HTTP:

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

หวังว่านี่จะช่วยได้


2
มันอยู่ในอันดับสูงสุด
Pmpr

19

คำสั่งเช่นด้านล่างจะแสดงสามส่วน ได้แก่ ส่วนหัวคำขอส่วนหัวตอบกลับและข้อมูล (คั่นด้วย 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/< // - ลบคำนำหน้า '<'

11

ฉันรู้ว่านี่มันช้าไปหน่อย แต่วิธีที่ฉันชอบในการทำเช่นนี้คือ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ผู้ฟังในพื้นที่จนกว่าคุณจะพอใจ


6

ดัมพ์ส่วนหัวในไฟล์เดียวและเพย์โหลดของการตอบกลับในไฟล์อื่น

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

5
curl -s -v -o / dev / null -H "Testheader: test" http://www.example.com

คุณสามารถใช้-Iตัวเลือกหากคุณต้องการส่งคำขอ HEAD ไม่ใช่คำขอ GET


3

นี่คือไคลเอนต์ 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

3

คุณสามารถดูได้โดยใช้ -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

คุณสามารถใช้wiresharkหรือtcpdumpเพื่อดูการรับส่งข้อมูลเครือข่ายใด ๆ (http ด้วย)


11
ถ้าเพย์โหลดมีค่าเกิน HTTPS สิ่งเหล่านั้นจะไร้ประโยชน์หากไม่มีพร็อกซีหรือมอนิเตอร์เลเยอร์ของแอปพลิเคชัน
p00ya

1

ส่งคำขอตัวอย่างไปที่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สำหรับรายละเอียดเพิ่มเติม


1
ขอบคุณในขณะที่ไม่ตอบคำถามนี่คือสิ่งที่ฉันต้องการ อุปกรณ์ A ทำการร้องขออุปกรณ์ B ตรวจสอบการร้องขอ
domen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.