Câu hỏi Bắt curl để xuất mã trạng thái HTTP?


Tôi đang sử dụng curl tại dòng lệnh trên Linux để phát hành các yêu cầu HTTP. Các cơ quan đáp ứng được in ra tiêu chuẩn, điều đó là tốt, nhưng tôi không thể nhìn thấy từ trang người đàn ông làm thế nào để có được curl để in mã trạng thái HTTP từ phản ứng (404, 403 vv). Điều này có thể không?


563
2018-04-18 10:28


gốc


Đối với tôi, tôi có thể thấy từ hướng dẫn cách lấy mã trạng thái HTTP, nhưng tùy chọn -w không hoạt động. Tôi đã báo cáo lỗi cho Apple. - Nicolas Barbulesco
Các -i cờ, như trong curl -i https://www.example.com/, có lẽ là những gì bạn muốn, theo superuser.com/a/514798/190188 - caw


Các câu trả lời:


Điều này sẽ làm việc cho bạn nếu máy chủ web có thể phản hồi các yêu cầu HEAD (điều này sẽ không thực hiện GET):

curl -I http://www.example.org

Ngoài ra, để cho cURL theo dõi chuyển hướng (trạng thái 3xx), hãy thêm -L.


351
2018-04-18 10:56



NB: curl -I thực hiện yêu cầu HTTP HEAD, có thể có vấn đề khi kiểm tra mã trạng thái HTTP cho một số máy chủ và dịch vụ ứng dụng web - Jay Taylor
Và để chỉ lấy số trạng thái, hãy đưa nó đến head -n 1|cut -d$' ' -f2 - Benubird
Đừng quên chuyển hướng stderr của curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Thêm -L để cuộn tròn nếu bạn cần trạng thái cuối cùng sau khi chuyển hướng. - Aaron Blenkush
Theo chuyển hướng sau khi chỉ thực hiện yêu cầu HEAD có thể gây ra hành vi thú vị, tùy thuộc vào cách ứng dụng được lập trình. - Scott McIntyre
curl -I -X GETsẽ gửi yêu cầu GET, nhưng cung cấp cho cùng một đầu ra. - jiggy


Một cách cụ thể hơn để in ra chỉ mã trạng thái HTTP là một cái gì đó dọc theo dòng:

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

Dễ dàng hơn nhiều khi làm việc với các tập lệnh, vì nó không yêu cầu bất kỳ phân tích cú pháp nào :-)

Tham số -I có thể được thêm vào để cải thiện hiệu năng tải phản hồi. Thông số này chỉ yêu cầu trạng thái / tiêu đề phản hồi, không có nội dung phản hồi tải xuống. (% {http_code} trả về dòng đầu tiên của tải trọng HTTP)

I E.:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

631
2018-06-28 00:25



-w "% {http_code}" là bit in mã trạng thái. Bạn có thể thêm một hoặc hai dòng mới vào đó để tách mã khỏi phần thân (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Wow, cái này /dev/null điều thậm chí hoạt động trong phiên bản curl Windows mà tôi đang sử dụng. - Uwe Keim
Tôi tin rằng điều này tải toàn bộ tập tin mặc dù tất cả đi vào / dev / null, vì vậy không lý tưởng để kiểm tra mã trạng thái cho các tệp lớn. httping -c 1 -s -G -m phát hành GET và không tải xuống toàn bộ tệp, mặc dù tôi nhận thấy câu hỏi này đặc biệt về curl. - RomanSt
@romkyns, bạn chính xác: biến thể đầu tiên trong câu trả lời của tôi tải xuống toàn bộ tệp và "lưu" nó vào /dev/null, nhưng biến thể thứ hai - tức là. người dùng -I tùy chọn cho curl - không. Tuy nhiên, cẩn thận phải được thực hiện, vì bạn không thực sự thử nghiệm cùng một hành động: một thực hiện một HTTP GET yêu cầu, trong khi người kia tạo ra HEAD yêu cầu ... một số máy chủ web / trang web sẽ phản hồi với mã trạng thái khác, ngay cả khi URL được yêu cầu giống hệt nhau! - pvandenberk
FYI: -s = Không hiển thị tiến trình tải xuống, -o /dev/null = không hiển thị thân thể, -w "%{http_code}" = Viết mã phản hồi http để stdout sau khi thoát. - Ajedi32


Nếu bạn muốn xem tiêu đề cũng như kết quả, bạn có thể sử dụng tùy chọn tiết:

curl -v http://www.example.org
curl --verbose http://www.example.org

Trạng thái sẽ xuất hiện trong tiêu đề. Ví dụ.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

173
2018-05-03 04:28



1 để chỉ ra cờ chi tiết cung cấp các chi tiết bổ sung. Tuyệt vời để thử nghiệm các ứng dụng REST. - MrOodles
+1 rất dễ sử dụng khi thực hiện yêu cầu POST (curl -v --data "...") - MegaTux
Nó thậm chí chia tách chúng thành hai đầu ra tệp khác nhau (chi tiết trạng thái http cho stderr và phần thân phản hồi để stdout) - Blauhirn


Bạn có thể in mã trạng thái, ngoài tất cả tiêu đề bằng cách làm như sau:

curl -i http://example.org

Điều tốt về -i là nó hoạt động với -X POST cũng.


144
2017-12-04 20:45



Tốt hơn nhiều so với câu trả lời được chấp nhận (yêu cầu HEAD). - neu242
Có thể hiển nhiên, nhưng -i làm việc với bất kì Phương thức HTTP, không chỉ GET và POST... :) - mac
câu trả lời tốt nhất vì nó làm cho đầu ra curl cả phần đầu và phần thân, làm cho nó phù hợp với hầu hết các tác vụ khi được sử dụng trong tập lệnh - Sarge Borsch
Đây là câu trả lời hay nhất và có thể được sử dụng kết hợp với -s (không hiển thị đồng hồ tiến độ hoặc thông báo lỗi) và -S(hiển thị thông báo lỗi sau khi tất cả) - Jonathan Hartley


Nếu bạn muốn nắm bắt mã trạng thái HTTP trong một biến, nhưng vẫn chuyển hướng nội dung tới STDOUT, bạn phải tạo hai STDOUT. Bạn có thể làm như vậy với quá trình thay thế> () và lệnh thay thế $ ().

Đầu tiên, tạo một bộ mô tả tập tin 3 cho quá trình hiện tại của bạn 'STDOUT với exec 3>&1.

Sau đó, sử dụng curl's -o tùy chọn để chuyển hướng nội dung phản hồi tới một FIFO tạm thời bằng cách sử dụng lệnh thay thế, và sau đó trong lệnh thay thế, chuyển hướng đầu ra trở lại quá trình mô tả tệp STDOUT hiện tại của bạn 3 với -o >(cat >&3).

Để tất cả chúng cùng nhau:

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

45
2018-01-08 20:59



Đó là một cái bẫy nghiêm trọng ... và tôi thích nó! - spyle
Bây giờ làm thế nào, lần lượt, tôi có thể chuyển hướng đầu ra đến một biến khác? - Roger Filmyer
Đầu ra là trong STDOUT, vì vậy bạn sẽ có thể chuyển hướng đầu ra từ lệnh đến bất cứ nơi nào bạn thích giống như một lệnh thông thường. Tôi đã không thử nghiệm này mặc dù. - Heath Borders


Xác định lại đầu ra curl:

curl -sw '%{http_code}' http://example.org

Có thể được sử dụng với bất kỳ loại yêu cầu nào.


26
2017-08-05 18:18



-k (--insecure) là trọng số -s (im lặng). - Ravichandra


Điều này sẽ gửi một yêu cầu đến url, chỉ nhận được dòng đầu tiên của phản hồi, chia nhỏ nó thành các khối và chọn thứ hai.

Nó chứa mã phản hồi

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



Bạn có thể giải thích mã này làm gì không và cách nó giải quyết vấn đề được OP đưa ra như thế nào? Mã không rõ nguyên nhân có thể xuất hiện không đáng tin cậy và nguy hiểm cho người dùng. - bwDraco
Chắc chắn, chúng tôi gửi yêu cầu đến url, chỉ nhận được dòng đầu tiên của phản hồi, chia nhỏ nó thành các khối và chọn thứ hai. Nó chứa mã phản hồi mà OP đang tìm kiếm. - Filip Spiridonov


Đối với yêu cầu POST, thông tin sau đã hoạt động:

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

8
2018-01-07 08:36





Mã trạng thái CHỈ CÓ

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

Tất cả tín dụng cho điều này Ý CHÍNH


8
2018-02-08 10:44