วิธีการส่งส่วนหัวโดยใช้การร้องขอ HTTP ผ่านการโทร curl?


1445

ฉันต้องการส่งส่วนหัวไปยังเซิร์ฟเวอร์ Apache บนกล่อง Linux ฉันจะทำสิ่งนี้ผ่านการโทรแบบขดได้อย่างไร?


60
มีวิธีที่ดีในการเรียนรู้วิธีใช้ curl สำหรับการร้องขอ HTTP ด้วยตัวอย่าง ดาวน์โหลดรุ่นล่าสุดของบุรุษไปรษณีย์สร้างการกำหนดค่าคำขอ HTTP ใด ๆ ตามที่คุณต้องการในระดับส่วนติดต่อผู้ใช้ (โพสต์ใส่รับ .. ตัวอย่างเช่นส่วนหัวและร่างกาย json) จากนั้นคลิกที่ "สร้างรหัส" และเลือกตัวเลือก "ขด" . มันช่วยให้คุณบรรทัดคำสั่งที่เทียบเท่า
Vinicius Lima

คำตอบ:


511

ได้รับ:

ด้วย JSON:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://hostname/resource

ด้วย XML:

curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource

โพสต์:

สำหรับการโพสต์ข้อมูล:

curl --data "param1=value1&param2=value2" http://hostname/resource

สำหรับการอัพโหลดไฟล์:

curl --form "fileupload=@filename.txt" http://hostname/resource

RESTful HTTP Post:

curl -X POST -d @filename http://hostname/resource

สำหรับการเข้าสู่เว็บไซต์ (รับรองความถูกต้อง):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

@filename หมายถึงอะไรสำหรับการโพสต์ RESTful คุณโพสต์ไฟล์ไปยังเซิร์ฟเวอร์ REST หรือไม่ ดูเหมือนจะแปลกสำหรับฉัน
JesseBoyd

6
สำหรับผู้ที่มาถึงในภายหลังซึ่งอาจจะสงสัยในสิ่งเดียวกัน ... @ สัญกรณ์เป็นวิธีการอ่านข้อมูลเพื่อส่งไปยังเซิร์ฟเวอร์จากไฟล์แทนที่จะใส่ข้อมูลลงในคำขอ curl คุณไม่โพสต์ไฟล์ต่อคุณโพสต์เนื้อหาของไฟล์เป็นเนื้อหาของคำขอ POST ของคุณ
f1dave

คำตอบโดยละเอียดเพิ่มเติมได้ที่นี่: stackoverflow.com/questions/14978411/… :)
Amith Koujalgi

1983

man curl:

   -H/--header <header>
          (HTTP)  Extra header to use when getting a web page. You may specify
          any number of extra headers. Note that if you should  add  a  custom
          header that has the same name as one of the internal ones curl would
          use, your externally set header will be used instead of the internal
          one.  This  allows  you  to make even trickier stuff than curl would
          normally do. You should not replace internally set  headers  without
          knowing  perfectly well what you're doing. Remove an internal header
          by giving a replacement without content on the  right  side  of  the
          colon, as in: -H "Host:".

          curl  will  make sure that each header you add/replace get sent with
          the proper end of line marker, you should thus not  add  that  as  a
          part  of the header content: do not add newlines or carriage returns
          they will only mess things up for you.

          See also the -A/--user-agent and -e/--referer options.

          This option can be used multiple times to add/replace/remove  multi-
          ple headers.

ตัวอย่าง:

curl --header "X-MyHeader: 123" www.google.com

คุณสามารถดูคำขอที่ส่งโดยการเพิ่ม-vตัวเลือก


74
หากคุณต้องการส่งหลายส่วนหัวใช้มากกว่าหนึ่ง - ส่วนหัวก็โอเค curl จะแยกแต่ละส่วนเป็นส่วนหัวที่แตกต่างกัน ไม่มีวิธีในการแยกส่วนหัวภายในพารามิเตอร์ --header เดียวกัน ตัวอย่าง: curl - ส่วนหัว "ยอมรับ: javascript" - ส่วนหัว "ทดสอบ: สวัสดี" -v www.google.com
Hatoru Hansou

2
หากผู้คนต้องการตัวอย่างฉันจะฝากไว้ที่นี่: bropages.org
Peter Westmacott

man pages (บน OSX เป็นอย่างน้อย) ตอนนี้ให้ใส่ตัวอย่าง: ตัวอย่าง: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii

6
@MartinKonicek และคนอื่น ๆ : ฉันขอแนะนำ tldr utiltiy (ชง, ฯลฯ ติดตั้ง tldr) มันเป็นเพียงตัวอย่าง เช่น "- ส่งคำขอพร้อมส่วนหัวพิเศษโดยใช้วิธี HTTP ที่กำหนดเอง: curl -H 'X-My-Header: 123' -X PUT example.com "

280

ในPHP :

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue'));

หรือคุณสามารถตั้งค่าหลายรายการ:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));

1
@ James ใช้งานได้ดีในบางกรณี แต่ในบางกรณี CURL ส่งส่วนหัวเพิ่มเติม "คาดหวัง: 100 ต่อไป" - มีความคิดเกี่ยวกับวิธีลบออกไหม
coding_idiot

@coding_idiot: คุณสามารถผ่าน "คาดหวัง:" ในอาร์เรย์ของค่าส่วนหัวเพื่อปิดการใช้งาน ตัวอย่าง: curl_setopt ($ ch, CURLOPT_HTTPHEADER, อาร์เรย์ ('HeaderName: HeaderValue', 'คาดหวัง:'));
อีเธอร์

12
OP ไม่ได้พูดอะไรเกี่ยวกับ PHP คิด
hanshenrik

ชื่อส่วนหัวจะถูกใส่ส่วนบนด้วยเครื่องหมายขีดล่างและ HTTP_ จะนำหน้า ตัวอย่างเช่น "protection-token" กลายเป็น "HTTP_PROTECTION_TOKEN"
Bimal Poudel

54

10
สามารถใช้ตัวเลือก -H ในพรอมต์คำสั่งเช่น: curl -H "pwd: 123" localhost / test.php
shasi kanth

ขอบคุณ สั้นกระชับและครอบคลุมด้วยลิงก์ไปยังเอกสาร อย่างไรก็ตามลิงค์นี้ล้าสมัยไปแล้วลิงค์ใหม่ในขณะนี้คือcurl.haxx.se/docs/manpage.html#-H
Oleksii Kyslytsyn

44

GET (หลายพารามิเตอร์):

curl -X  GET "http://localhost:3000/action?result1=gh&result2=ghk"

หรือ

curl --request  GET "http://localhost:3000/action?result1=gh&result2=ghk"

หรือ

curl  "http://localhost:3000/action?result1=gh&result2=ghk"

หรือ

curl -i -H "Application/json" -H "Content-type: application/json"  "http://localhost:3000/action?result1=gh&result2=ghk"

1
ขอบคุณ ฉันไม่ทราบราคาที่บังคับสำหรับ URL ประเภทนี้
remat_br

12

ฉันใช้บุรุษไปรษณีย์

ดำเนินการสิ่งที่คุณต้องการโทร จากนั้นบุรุษไปรษณีย์ได้จัดเตรียมเครื่องมือที่มีประโยชน์ในการแสดงรหัสม้วน

รันในเทอร์มินัล ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


นี่คือสับดีที่จะสิ่งที่ความเร็วขึ้น แต่ต้องระวังการหลบหนีราคาเดียวหรือคำพูดสองถ้าคุณกำลังใช้สคริปต์เชลล์บน windows เป็นสคริปต์เปลือกมีมันเป็นความต้องการของการจัดรูปแบบของตัวเอง
Thierrydev

ในขณะที่บุรุษไปรษณีย์เป็นเครื่องมือที่ดี แต่เมื่อคุณไม่มีสภาพแวดล้อมแบบกราฟิกเช่นใน Kubernetes pods มันก็ไร้ประโยชน์ เรียนรู้การม้วนงอและคุณสามารถทดสอบการพักผ่อนได้เสมอ
นัมกิเบีย

11

คุณสามารถส่งหลายเฮดเดอร์ข้อมูล (ตัวอย่างเช่น JSON) และระบุวิธีการโทร (POST, GET) ลงในการโทร CUrl ครั้งเดียวดังนี้:

curl -X POST(Get or whatever) \
  http://your_url.com/api/endpoint \
  -H 'Content-Type: application/json' \
  -H 'header-element1: header-data1' \
  -H 'header-element2: header-data2' \

...... ส่วนหัวเพิ่มเติม ................

  -d '{
  "JsonExArray": [
    {
      "json_prop": "1",
    },
    {
      "json_prop": "2",
    }
  ]
}'


7

ในกรณีที่คุณต้องการส่งส่วนหัวที่กำหนดเองคุณสามารถทำได้ด้วยวิธีนี้:

curl -v -H @{'custom_header'='custom_header_value'} http://localhost:3000/action?result1=gh&result2=ghk

2

ในอนาคอนด้าที่มีความต้องการผ่านwindowsคำสั่งควรเป็น: GET, เช่น:

curl.exe http://127.0.0.1:5000/books 

โพสต์หรือแก้ไขข้อมูลเช่น:

curl.exe http://127.0.0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\"rating\":\"2\"}' 

PS: เพิ่มแบ็กสแลชสำหรับข้อมูล json เพื่อหลีกเลี่ยงข้อผิดพลาดประเภทนี้ => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

และใช้curl.exeแทนcurlเพื่อหลีกเลี่ยงปัญหานี้เท่านั้น:

Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Content-Type: application/json" value of type
"System.String" to type "System.Collections.IDictionary".
At line:1 char:48
+ ... 0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\" ...
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.