Câu hỏi Tôi có thể làm cho cURL thất bại với một exitCode khác 0 nếu mã trạng thái HTTP không phải là 200?


Tôi đã luôn luôn giả định rằng khi curl nhận được một phản ứng HTTP 500 nó đã trở về một mã thoát có nghĩa là thất bại (! = 0), nhưng điều đó có vẻ là không phải trường hợp.

Có cách nào tôi có thể làm cho cURL thất bại với một exitCode khác với 0 nếu mã trạng thái HTTP không phải là 200? Tôi biết tôi có thể sử dụng -w "%{http_code}" nhưng điều đó đặt nó trong STDOUT, không phải là mã thoát (bên cạnh đó, tôi cũng quan tâm đến việc bắt đầu ra, mà tôi không muốn chuyển hướng đến một tệp, nhưng đến màn hình).


160
2018-05-01 12:37


gốc




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


curl --fail làm một phần của những gì bạn muốn:

từ man curl:

-f, --fail

(HTTP) Không âm thầm (không có đầu ra nào cả) trên các lỗi máy chủ. Điều này chủ yếu được thực hiện để cho phép các tập lệnh tốt hơn, vv để xử lý tốt hơn với các lần thử không thành công. Trong trường hợp bình thường khi máy chủ HTTP không cung cấp tài liệu, máy chủ trả về một tài liệu HTML cho biết (thường cũng mô tả lý do và nhiều hơn nữa). Lá cờ này sẽ ngăn chặn curl xuất ra và trả lại lỗi 22.

Phương pháp này không an toàn và có những trường hợp mã phản hồi không thành công sẽ trượt qua, đặc biệt khi xác thực có liên quan (mã phản hồi 401 và 407).

Nhưng nó chặn đầu ra màn hình.


180
2017-10-10 18:36



Vì vậy, những phần của nó hiện nó làm và không làm gì? - rogerdpack
@rogerdpack tl; dr nó trả về nonzero khi nó phát hiện một phản ứng xấu, nhưng nó sẽ không cho phép OP nắm bắt phản hồi - rampion
Điều này không bắt được HTTP 301 Di chuyển vĩnh viễn. curl vẫn cung cấp mã thoát 0. - wisbucky
@wisbucky 301 không phải là lỗi, đó là mã trạng thái chuyển hướng. Lỗi là mã trạng thái 4xx và 5xx. - M. Justin


Nếu bạn chỉ muốn hiển thị nội dung của trang được cuộn tròn, bạn có thể thực hiện việc này:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

Điều này ghi nội dung của trang vào STDERR trong khi viết mã trạng thái HTTP thành STDOUT, vì vậy nó có thể được gán cho biến STATUSCODE.


61
2018-05-01 15:31



Làm thế nào về nếu tôi muốn sản xuất phản ứng về thất bại (không 200), nhưng trả lại không 0 mã trạng thái từ tập lệnh? - Justin
@Justin: Còn về if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: Chỉ hỗ trợ các mã thoát 8 bit chưa được ký, do đó có thể gây nhầm lẫn một chút. - Dennis
Ah, phải - và mã sẽ quấn ở 8 bit, do đó lỗi 404 trở thành giá trị thoát 148, 500 trở thành 244. Thật khó hiểu! :-) - ghoti
Là một biến thể nhỏ, điều này sẽ nắm bắt mã trong một biến trong khi chuyển hướng phản hồi tới stdout, chứ không phải stderr: { code=$(curl ... as above ...); } 2>&1 Bí quyết là { ... } 2>&1 cho phép chuyển hướng, trong khi không sinh ra một trình bao khác ( ... ) sẽ. - Tobia


Tôi đã có thể làm điều đó bằng cách sử dụng kết hợp cờ:

curl --silent --show-error --fail URL

--silent ẩn tiến trình và lỗi
--show-error hiển thị thông báo lỗi bị ẩn bởi --silent
--Thất bại trả về mã thoát> 0 khi yêu cầu không thành công


11
2017-09-12 14:48



Điều này không hiển thị trả lời của máy chủ. Tôi không OP nhưng tôi nghi ngờ ông muốn xem bất kỳ thông báo lỗi từ máy chủ được trả lại trong cơ thể. Bên cạnh một --silent --show-error --fail hoạt động giống như chỉ -f/--fail. - waste
Thực ra, --fail trả về mã thoát 22, như tài liệu. - Quolonel Questions
Điều này không bắt được HTTP 301 Di chuyển vĩnh viễn. curl vẫn cung cấp mã thoát 0. - wisbucky
@wisbucky 301 không phải là lỗi, đó là mã trạng thái chuyển hướng. Lỗi là mã trạng thái 4xx và 5xx. - M. Justin