1.1 Panimula sa HttpClient

Simula sa JDK 11, nagdagdag ang mga developer ng Java platform ng isang makapangyarihang bagong tool sa JDK para sa paggawa ng mga kahilingan sa http, ang java.net.http. Naglalaman ito ng apat na pangunahing klase:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • web socket

Ito ay napakalakas na mga klase na nagbibigay-daan sa iyong gawin ang lahat ng posibleng uri ng mga kahilingan gamit ang HTTP, HTTP/2at WebSocket.

Bilang karagdagan, maaari mong gamitin ang mga klase na ito upang gumawa ng parehong kasabay at asynchronous na mga kahilingan sa http.

Ang paggawa ng kahilingan sa http ay binubuo ng mga sumusunod na bahagi:

  1. Lumikha ng isang bagayHttpClient
  2. Lumikha ng isang bagayHttpRequest
  3. Pagpapadala ng kahilingan gamit ang send()o pamamaraansendAsync()
  4. Pagproseso ng tugonHttpResponse

Isang halimbawa ng naturang kahilingan:


 HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_1_1)
        .followRedirects(Redirect.NORMAL)
        .connectTimeout(Duration.ofSeconds(20))
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
        .authenticator(Authenticator.getDefault())
        .build();
 
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body()); 

1.2 Deklarasyon na diskarte

Sa halimbawa sa itaas, makikita mo ang isang halimbawa ng tinatawag na declarative approach sa pagsulat ng code. Tingnan natin ang unang bahagi ng halimbawa:


 HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();

Ano ang magiging hitsura ng code na ito na nakasulat sa klasikong istilo:


HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setProxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)));
client.setAuthenticator(Authenticator.getDefault());

Kapag gumagamit ng deklaratibong diskarte sa code, dalawang bagay ang nagbabago. Una , lahat ng mga pamamaraan ng klase HttpClient ay nagbabalik ng kanilang sariling bagay , na nagpapahintulot sa iyo na ayusin ang code sa anyo ng mga kadena.

Klasikong code:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Bilang isang kadena:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Inilipat namin ang bawat pamamaraan sa isang hiwalay na linya (ito ay isang mahabang pahayag)

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Pangalawa , ang prefix ay tinanggal mula sa mga pamamaraan set, na nagbibigay-daan sa iyo upang magsulat ng code nang mas compact:

ay

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Ito ay naging

HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());
    

Ang ganitong code ay mas madaling basahin, bagama't mas mahirap isulat.

At isa pang mahalagang punto. Sa halimbawang ito, ginamit ang pattern ng Tagabuo. May mga sitwasyon kung saan ang paglikha ng isang bagay ay isang kumplikadong proseso. Samakatuwid, mas gusto nilang gawing pormal ito: nagsisimula ito sa isang conditional method call begin()at nagtatapos sa conditional method call end().

Sa halimbawang sinuri namin, ang pamamaraan HttpClient.newBuilder()ay nagbabalik ng isang bagay HttpClient.Builder(ito ay isang panloob na klase ng utility ng klase HttpClient). Ang lahat ng mga pamamaraan ng uri version()ay tinatawag lamang sa bagay na ito ng serbisyo. Buweno, ang tawag ng pamamaraan build()ay nagmamarka ng pagtatapos ng pagtatayo ng bagay at ibinabalik ang bagay HttpClient.