4.1 Методът send(), BodyHandlers
Приключихте с обучението How да формирате http заявка , така че можете да преминете към най-важното нещо - изпращането на тази заявка. В най-простия случай това е лесно да се направи:
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
И Howви са BodyHandlers
тези? Какво мислиш? Изпратихте заявка, което означава, че трябва да получите отговор - http response
. И този отговор може да има response body
: низ, файл, масив от byteове, InputStream.
Да, да, точно така. Точно Howто при формиране на заявка, трябва да посочите типа response body
на отговора. Могат да бъдат общо 8 броя:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
В зависимост от типа, BodyHandlers
който сте предали на метода send()
, той ще върне такъв тип резултат. Пример:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
Ако трябва да ви бъде изпратен файл като отговор, тогава BodyHandlers.ofFile()
трябва да предадете името на локалния файл на метода, където той ще бъде записан от обекта HttpClient.
4.2 метод followRedirects().
301
Освен това, когато изпращате заявка, можете да посочите Howво трябва да направи HttpClient, ако сървърът изпрати or 302
(временно or постоянно пренасочване) в отговор . Представете си, че сървърът е изпратил code 302
и трябва да: проследите тази ситуация, да получите нов URL от отговора и да изпратите заявката на новия address.
Не бих искал да правя това, особено като се има предвид, че тази ситуация е често срещана и отдавна е автоматизирана във всички http клиенти. Също така в този HttpClient просто трябва да посочите кой режим на пренасочване избирате, когато изпращате заявката.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Има само 3 опции за пренасочване:
- ВИНАГИ - винаги;
- НИКОГА - никога;
- НОРМАЛНО - винаги, с изключение на HTTPS -> HTTP.
Както можете да видите, тук няма много опции, но винаги е по-добре да имате възможност за персонализиране, отколкото да я нямате.
4.4 Методът proxy().
Има още няколко полезни, но не често използвани опции. Не ти трябват точно докато не ти потрябват :)
Първият е прокси. В обикновения живот не ги срещате често, но много големи корпорации имат сложна система за сигурност на интернет трафика вътре в тях, а оттам и различни прокси настройки.
Е, разбира се, вашият софтуер, който ще работи някъде в недрата на такава корпорация, някой ден ще се сблъска с факта, че ще трябва да използва прокси. Затова е добре, че и тук има такава опция.
Настройването на прокси е много просто - пример:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Проксито по подразбиране е избрано тук, но може да искате да зададете свой собствен:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Как точно да работим с прокси, няма да разглеждаме, тъй като това не е включено в обхвата на този курс.
4.5 удостоверител()
И още един важен момент. HTTP протоколът поддържа удостоверяване. Точно на ниво протокол.
Сега този подход почти не се използва, но преди около 20 години беше обичаен. Http заявката изглеждаше така:
http://username@example.com/
Или дори така:
http://username:password@example.com/
Това не е поща. Точно това е връзката. И да, не сте мислor така. Влизането и дори паролата могат да бъдат посочени директно в http заявката. Да, дори и сега можете. Затова пиша, че сега никой обикновено не прави това. Но има такава възможност.
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
Това е интересно! Знаете ли защо instead of “password"
в codeа пише "password".toCharArray()
?
Тъй като вторият параметър на конструктора PasswordAuthentication
не е String
, а CharArray
.
А защо вторият параметър не е String
, а CharArray
?
Тъй като всички пароли не могат да се съхраняват като цял низ за целите на сигурността, дори във вашето собствено приложение . Тоест приложението ви не трябва да съхранява паролата като низ в паметта си. Така че, ако някой направи влажна памет, паролата не може да бъде извадена от нея ...
Но в същото време паролата може да се предава по несигурен HTTP протокол през половината свят :) :) :)
Добре. Светът не е идеален.
Можете да прочетете повече по тази тема на връзките по-долу: