Yêu cầu HTTP (S) thủ công


10

Tôi đang tìm kiếm một công cụ (có thể trên Linux) cho phép tôi thực hiện yêu cầu HTTP hoặc HTTPS thủ công. Bằng tay, tôi thực sự có ý đó: Tôi có thể cung cấp cho nó một tệp văn bản trông giống như

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11

Hello world

và một URL đích (www.example.com/foo) và gửi yêu cầu tới URL. Nhiều nhất, sẽ hữu ích nếu tiêu đề Content_Lstep được tự động tính toán.

Tôi có thể viết một công cụ như vậy bằng cách sử dụng một số thư viện như omeplib trong Python, nhưng lý do tôi cần nó là điều tra thủ công khi có sự cố xảy ra với các thư viện đó.


1
Câu hỏi cụ thể của https: superuser.com/questions/346958/
Mạnh

Câu trả lời:


10

wget có một tùy chọn --post-file sẽ phù hợp với bạn.

Chỉnh sửa: Ngoài ra, có Ncat , mà bạn sẽ sử dụng theo cách tương tự với đề xuất telnet của Randolf Richardson, ngoại trừ việc nó cũng hỗ trợ SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt

6
Nếu bạn cần HTTPS, hãy sử dụng openssl thay vì netcat: openssl s_client -connect <địa chỉ>: 443
Ambroz Bizjak

1
wget --post-file sẽ thêm các tiêu đề và chỉ sử dụng tệp được chỉ định cho phần thân của yêu cầu.
David Balažic

6

Đối với HTTP (không phải HTTPS), một thay thế cho lệnh "wget" xuất hiện trong tâm trí là sử dụng telnet như sau:

  • tên máy chủ telnet 80 <input.txt> output.txt

Tệp "input.txt" là danh sách các lệnh được đặt sẵn mà bạn muốn cung cấp cho máy chủ lưu trữ tại tên máy chủ và tệp "output.txt" sẽ lưu trữ phản hồi.


1
Điều này khiến tôi tự hỏi liệu netcat có hỗ trợ SSL hay không, và có, Ncat, một bản sao netcat hỗ trợ SSL.
Chris Acheson

@Chris Acheson (+1): Thật tuyệt vời! Xin vui lòng sao chép những gì tôi đã viết trong một câu trả lời riêng biệt và điều chỉnh nó thành một giải pháp sử dụng NetCat (Tôi sẽ bỏ phiếu cho câu trả lời của bạn nếu bạn làm điều này).
Randolf Richardson

1

Bạn có thể đưa ra yêu cầu GET với OpenSSL:

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

Lưu ý rằng bạn cũng có thể sử dụng "HTTP / 2", nhưng hãy cẩn thận vì một số máy chủ (ví dụ: github.com) không hỗ trợ nó.


0

Đối với tôi, nó đã làm việc tạo một tệp yêu cầu (Ví dụ request.txt:)

POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Connection: close

Hello world

Và sau đó gọi openssl s_clientlệnh:

cat request.txt | openssl s_client -quiet -connect www.example.com:443

Tuy nhiên, hãy cẩn thận về một số điểm:

  • Các tập tin phải được mã hóa đúng, đặc biệt là nội dung. Tốt hơn nếu bạn bao gồm một tiêu đề Content-type: text/plain; charset=utf-8nếu tệp được mã hóa utf-8.
  • Các kết thúc dòng cho các tiêu đề phải là CR / LF . Chỉ với LF, máy chủ web mới có thể quay trở lại HTTP/1.1 505 HTTP Version Not Supported, vì giao thức HTTP tiêu chuẩn sử dụng CR / LF cho các kết thúc dòng ( https://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec4.html ). Bạn có thể sử dụng unix2doslệnh để thực hiện chuyển đổi này.
  • Thêm một Connection: closetiêu đề để chấm dứt yêu cầu và trở về từ cuộc gọi. Nếu không, lệnh sẽ chờ tương tác của người dùng, nếu máy chủ thường trả lời bằng một Connection: keep-alivetiêu đề.

-1

Tôi ngạc nhiên không ai nhắc đến cURL . Nó được làm chính xác cho những gì bạn muốn làm. Và nó có sẵn trên thực tế bất kỳ nền tảng nào (bao gồm cả Windows).

Vì vậy, ví dụ của bạn, tất cả những gì bạn sẽ làm là:

curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com

Mà được chụp từ Wireshark sẽ net bạn:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11

Hello world

Bạn có thể dễ dàng sửa đổi các tiêu đề hơn nữa nếu bạn muốn làm tất cả các loại công cụ (tức là thay đổi tác nhân người dùng, v.v.).

Chỉnh sửa: Không nhận thấy yêu cầu "từ một tệp". Bạn cũng có thể làm điều đó, cả tệp ascii hoặc tệp nhị phân. Bạn chỉ cần chỉ định tên tệp bằng ký hiệu @

-d @/tmp/HelloWorldFile

curl gần như là những gì tôi muốn, nhưng yêu cầu tôi chỉ định các tiêu đề trên dòng lệnh, điều này rất không thực tế. Tôi cần một cái gì đó cho phép tôi chỉ định văn bản đầy đủ của yêu cầu, bao gồm phương thức và các tiêu đề, từ một tệp và ncat thực hiện những gì tôi muốn. Dù sao cũng cảm ơn bạn :-)
Andrea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.