ค้นหาเว็บไซต์

วิธีใช้ cURL ใน PowerShell


เครื่องมือบรรทัดคำสั่ง cURL (URL ไคลเอนต์) มักใช้เพื่อส่งหรือรับข้อมูลไปยังเซิร์ฟเวอร์ ข้อได้เปรียบของเครื่องมือคือรองรับหลายโปรโตคอลและมีฟีเจอร์ต่างๆ เช่น การตรวจสอบสิทธิ์ พร็อกซี ประวัติการโอน และอื่นๆ อีกมากมาย

เรายังสามารถใช้ cURL ใน PowerShell ได้ แต่มีสิ่งสำคัญบางประการที่คุณต้องรู้ และ PowerShell ยังมีวิธีการถ่ายโอนข้อมูลเข้าและออกจากเซิร์ฟเวอร์เป็นของตัวเอง

ในบทความนี้ ฉันจะอธิบายวิธีที่คุณสามารถใช้ cURL ใน PowerShell และยกตัวอย่างบางส่วนให้กับคุณ

PowerShell cURL

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

ตอนนี้ก่อนที่เราจะสามารถใช้ cURL ใน PowerShell ได้ มีสิ่งสำคัญสิ่งหนึ่งที่คุณต้องรู้ จนถึง PowerShell 6 คำสั่ง cURL เคยเป็นนามแฝงใน PowerShell สำหรับ cmdlet Intake-WebRequest สิ่งนี้ทำให้เกิดปัญหา/ความสับสนมากมาย ดังนั้นตั้งแต่ PowerShell 6 คำสั่ง cURL ในตอนนี้จะเรียกใช้โปรแกรมอรรถประโยชน์ curl.exe

เราสามารถเห็นสิ่งนี้ได้โดยการค้นหาคำสั่งด้วย Get-Command cmdlet ทั้งใน PowerShell 5 และ PowerShell 7:

อย่างที่คุณเห็นคำสั่ง curl เรียก curl.exe ใน PowerShell 7 เช่นเดียวกับที่เราคาดหวัง แต่ใน PowerShell 5.1 คำสั่งนั้นเป็นนามแฝงจริงๆ

ปัญหาคือไวยากรณ์ทั้งหมดของ Inrigger-WebRequest cmdlet แตกต่างจาก cURL ดังนั้นคำสั่งของคุณจะไม่ทำงานตามที่คุณคาดหวัง

cURL ได้รับการติดตั้งบน Windows 10/11 ตามค่าเริ่มต้น แต่ถ้าคุณไม่ได้ติดตั้ง cURL คุณสามารถดาวน์โหลดได้ที่นี่

การลบ Alias cURL

หากคุณต้องการใช้ยูทิลิตีบรรทัดคำสั่ง cURL จริงใน PowerShell 5.1 คุณมีสองตัวเลือก คุณสามารถใช้ curl.exe เป็นคำสั่งหรือลบนามแฝงออกได้ ฉันชอบอย่างหลังเพราะจะทำให้แน่ใจว่าสคริปต์ของคุณทำงานบน PowerShell 7 ได้เช่นกัน หากต้องการลบนามแฝง คุณสามารถใช้คำสั่งต่อไปนี้:

Remove-Item alias:curl

การใช้ cURL ใน PowerShell

ลองมาดูตัวอย่างวิธีใช้ cURL ใน PowerShell กัน ในตัวอย่างด้านล่าง ฉันจะแสดงเมธอด cURL ที่แท้จริงและเวอร์ชัน PowerShell Inrigg-WebRequest เพื่อให้คุณเข้าใจถึงความแตกต่างได้ดียิ่งขึ้น

คำขอ GET พื้นฐาน

หากต้องการรับเนื้อหาของ URL ที่เฉพาะเจาะจง เราสามารถใช้คำสั่งด้านล่าง

curl https://httpbin.org/ip
Invoke-WebRequest -Uri "https://httpbin.org/ip"

# In this case it's better to use, because the output is in JSON
Invoke-RestMethod https://httpbin.org/ip

การส่งข้อมูล

ตำแหน่งข้อมูล httpbin ที่ฉันใช้ในตัวอย่างด้านล่างจะส่งคืนข้อมูลที่เราส่งไป แต่ตัวอย่างนี้ก็สมบูรณ์แบบ ในการส่งข้อมูลด้วย cURL เราจำเป็นต้องตั้งค่าวิธี HTTP เป็น POST

curl -X POST https://httpbin.org/anything -d "test=data"

เมธอด Invivo-WebRequest ใช้หลักการเดียวกัน แต่มีไวยากรณ์ต่างกันเท่านั้น:

$body = "test=data"
Invoke-WebRequest -Uri "https://httpbin.org/anything" -Method POST -Body "test=data"

ในตัวอย่างข้างต้น เราจะส่งค่าเดียวไปยังจุดสิ้นสุด แต่โดยทั่วไปคือการส่งแบบฟอร์มหรือส่งหลายช่องไปยังจุดสิ้นสุด ใน cURL เราสามารถทำได้โดยการระบุฟิลด์โดยใช้พารามิเตอร์ -F

# POST form data with multiple fields
curl -X POST https://httpbin.org/post `
  -F "name=John Doe" `
  -F "email=john@example.com" `
  -F "message=Hello World"

# Or for a JSON payload
curl -X POST https://httpbin.org/post -H "Content-Type: application/json" `
  -d '{"field1":"value1","field2":"value2","field3":"value3"}'

เมื่อใช้เมธอด Invoke-WebRequest เราสามารถสร้างแฮชเทเบิลด้วยข้อมูลฟอร์มที่เราต้องการโพสต์ได้ก่อน และเพื่อให้โค้ดสามารถอ่านได้ เรายังสามารถใช้ hashtable และ splatting เพื่อจัดเก็บพารามิเตอร์ทั้งหมดได้

$formData = @{
    name = "John Doe"
    email = "john@example.com"
    message = "Hello World"
}

$post = @{
    Uri = "https://httpbin.org/post"
    Method = 'Post'
    Body = $formData
}

Invoke-WebRequest @post

การใช้การรับรองความถูกต้อง

API ส่วนใหญ่ต้องมีรูปแบบการตรวจสอบสิทธิ์เพื่อให้สามารถถ่ายโอนข้อมูลด้วย เมื่อพูดถึงการรับรองความถูกต้อง มีหลายวิธีการ แต่การรับรองความถูกต้องขั้นพื้นฐาน (ชื่อผู้ใช้และรหัสผ่าน) หรือการรับรองความถูกต้องโทเค็นผู้ถือเป็นตัวเลือกที่ใช้บ่อยที่สุด

หากต้องการใช้การตรวจสอบสิทธิ์ขั้นพื้นฐานกับ cURL คุณจะต้องส่งชื่อผู้ใช้และรหัสผ่านในรูปแบบ ชื่อผู้ใช้:รหัสผ่านd ในตัวอย่างด้านล่าง เราจะเพิ่มชื่อผู้ใช้และรหัสผ่านใน URL แต่นั่นเป็นเพียงการทดสอบเท่านั้น:

curl -u "username:password" https://httpbin.org/basic-auth/username/password

# returns on succesfull authentication
{
  "authenticated": true,
  "user": "username"
}

เมื่อใช้เมธอด PowerShell Invoke-WebRequest เราต้องสร้างออบเจ็กต์ข้อมูลรับรองก่อน คุณสามารถขอให้ผู้ใช้ป้อนข้อมูลประจำตัวด้วย cmdlet Get-Credential แต่เมื่อคุณต้องการจัดเก็บข้อมูลประจำตัวในสคริปต์ของคุณ คุณจะต้องแปลงเป็นสตริงที่ปลอดภัยก่อน:

# Get the credentials from the user
$Credentials = Get-Credential -UserName "username" -Message "Enter your password"

# Or store the credentials in the script
$Password = ConvertTo-SecureString "password" -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential ("username", $Password)

Invoke-WebRequest -Uri "https://httpbin.org/basic-auth/username/password" -Credential $Credentials

ห่อขึ้น

เป็นสิ่งที่ดีที่ Microsoft ลบนามแฝง cURL ใน PowerShell 7 เนื่องจากแม้ว่า cURL และ Intake-WebRequest อาจดูคล้ายกัน แต่ cURL ก็มีความสามารถมากกว่ามาก หากคุณกำลังสร้างสคริปต์ที่จะทำงานบนเครื่องอื่น คุณสามารถใช้คำสั่ง curl.exe เพื่อให้แน่ใจว่ามีการใช้ cURL แทน Inrigg-WebRequest

หวังว่าคุณจะชอบบทความนี้ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง