CodeGym /Khóa học Java /Mô-đun 3 /Thêm nội dung vào HttpRequest

Thêm nội dung vào HttpRequest

Mô-đun 3
Mức độ , Bài học
Có sẵn

3.1 Nhà xuất bản cơ thể

Tôi hy vọng bạn chưa quên rằng ngoài các yêu cầu GET , còn có các yêu cầu PUTPOST , khi bạn cũng cần thêm vào yêu cầu request body, tức là phần thân yêu cầu.

HttpRequestLớp này có một lớp bên trong đặc biệt cho việc này BodyPublisher. Mặc dù về mặt kỹ thuật, đây là một giao diện có nhiều triển khai, chúng ta sẽ thảo luận bên dưới

Và chúng ta sẽ bắt đầu với cách đơn giản nhất - không có phần thân yêu cầu. Vâng, nó xảy ra.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.noBody())
   .build();

Đơn giản và đẹp.

3.2 ofString()

Tùy chọn phổ biến thứ hai là chuyển một số chuỗi làm phần thân yêu cầu. Điều này được thực hiện rất đơn giản:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "text/plain;charset=UTF-8")
   .POST(HttpRequest.BodyPublishers.ofString("Hello"))
   .build();

Nhân tiện, bạn có thể đặt mã hóa của chuỗi được truyền. Nó có thể rất hữu ích nếu máy chủ http mà yêu cầu được gửi đến không hoạt động trên UTF8.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
   .build();

3.3 củaTệp()

Cuối cùng, bạn có thể muốn đính kèm tệp vào yêu cầu POST . Đây là cách hình đại diện của bạn thường được tải lên máy chủ. Để làm điều này, bạn cần gọi phương thức ofFile(), nơi chuyển Pathtệp cục bộ:


Path avatar = Path.of("c://avatar.jpeg");
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "image/jpeg")
   .POST(HttpRequest.BodyPublishers.ofFile(avatar))
   .build();

3.4 củaByteArray()

Một tình huống phổ biến khác là gửi một tập hợp byte đến máy chủ. Ví dụ: bạn đã tuần tự hóa một số đối tượng dưới dạng một tập hợp byte, mã hóa thứ gì đó hoặc chỉ muốn gửi một số bộ đệm dữ liệu. Điều này đòi hỏi một phương pháp .ofByteArray().

Phương thức này lấy một mảng byte làm tham số. Ví dụ:


byte[] data = "My Secret Message".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
   .build();

3.5 củaInputStream()

Cuối cùng, kịch bản cuối cùng nhưng không kém phần thú vị là đính kèm InputStreammột yêu cầu POST .

Có một chức năng đặc biệt cho việc này ofInputStream(). Và cô ấy rất thông minh. Nó cho phép bạn tổ chức truyền dữ liệu từ luồng này sang luồng khác, đính kèm luồng dữ liệu vào yêu cầu POS thậm chí còn chưa được mở.

Bạn cần truyền một hàm cho hàm này ofInputStream(), kết quả là hàm này sẽ trả về một luồng InputStream.

Ví dụ:


byte[] data = "My Secret Message".getBytes();
//wrapping an array of bytes into a stream.
InputStream is = new ByteArrayInputStream(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
   .build();

Tôi không thèm rào vườn ở đây, nhưng tôi nghĩ bạn hiểu nguyên tắc. Tại sao họ làm điều đó? Bạn hầu như luôn có thể sử dụng tệp ofByteArray(). Nhưng nếu bạn muốn gửi dữ liệu không đồng bộ hoặc bạn cần triển khai một số kịch bản đặc biệt phức tạp, thì bạn có thể sử dụng phương pháp này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION