Plaatsen met HttpClient

1. Overzicht

In deze tutorial - we zullen POSTEN met de HttpClient 4 - eerst autorisatie gebruiken, daarna de vloeiende HttpClient API.

Ten slotte bespreken we hoe u een bestand uploadt met Httpclient.

2. Basis POST

Laten we eerst een eenvoudig voorbeeld bekijken en een POST-verzoek verzenden met HttpClient.

We doen een POST met twee parameters: "gebruikersnaam"En"wachtwoord“:

@ Test openbare ongeldige whenSendPostRequestUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); Lijstparameters = nieuwe ArrayList (); params.add (nieuwe BasicNameValuePair ("gebruikersnaam", "John")); params.add (nieuwe BasicNameValuePair ("wachtwoord", "pass")); httpPost.setEntity (nieuwe UrlEncodedFormEntity (params)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Merk op hoe we een Lijst van NameValuePair om parameters in het POST-verzoek op te nemen.

3. POST met autorisatie

Laten we vervolgens kijken hoe we een POST kunnen doen met authenticatiegegevens met behulp van de HttpClient.

In het volgende voorbeeld sturen we een POST-verzoek naar een URL die is beveiligd met basisverificatie door een autorisatiekop toe te voegen:

@Test openbare leegte whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException, AuthenticationException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); httpPost.setEntity (nieuwe StringEntity ("testpost")); UsernamePasswordCredentials creds = nieuwe UsernamePasswordCredentials ("John", "pass"); httpPost.addHeader (nieuwe BasicScheme (). authenticate (creds, httpPost, null)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

4. POST met JSON

Laten we nu eens kijken hoe we een POST-verzoek met een JSON-body kunnen verzenden met behulp van de HttpClient.

In het volgende voorbeeld sturen we wat persoon informatie (id, naam) als JSON:

@ Test openbare ongeldige whenPostJsonUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); String json = "{" id ": 1," name ":" John "}"; StringEntity entiteit = nieuwe StringEntity (json); httpPost.setEntity (entiteit); httpPost.setHeader ("Accepteer", "application / json"); httpPost.setHeader ("Content-type", "application / json"); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Merk op hoe we de StringEntity om de hoofdtekst van het verzoek in te stellen.

We stellen ook de ContentType koptekst naar applicatie / jsonom de server de nodige informatie te geven over de weergave van de inhoud die we verzenden.

5. POST Met de HttpClient Vloeiende API

Laten we vervolgens POSTEN met de HttpClient Vloeiende API.

We gaan een verzoek sturen met twee parameters "gebruikersnaam"En"wachtwoord“:

@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect () gooit ClientProtocolException, IOException {HttpResponse response = Request.Post ("// www.example.com"). BodyForm (Form.form (). Add ("gebruikersnaam", "John") add ("gebruikersnaam", "John"). Add ("wachtwoord", "pass"). build ()) .execute (). returnResponse (); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

6. POST Multipart Request

Laten we nu een meerdelig verzoek posten.

We plaatsen een het dossier, gebruikersnaam en wachtwoord met MultipartEntityBuilder:

@ Test openbare ongeldig whenSendMultipartRequestUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addTextBody ("gebruikersnaam", "John"); builder.addTextBody ("wachtwoord", "pass"); builder.addBinaryBody ("bestand", nieuw bestand ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "bestand.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (multipart); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

7. Upload een het dossier Gebruik makend van HttpClient

Laten we vervolgens kijken hoe we een het dossier de ... gebruiken HttpClient.

We uploaden de "test.txt”Bestand met MultipartEntityBuilder:

@ Test openbare ongeldig wanneerUploadFileUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("bestand", nieuw bestand ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "bestand.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (multipart); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

8. Krijg het dossier UploadenVooruitgang

Eindelijk - laten we eens kijken hoe we de voortgang van het dossier uploaden met HttpClient.

In het volgende voorbeeld breiden we de HttpEntityWrapper om inzicht te krijgen in het uploadproces.

Ten eerste - hier is de uploadmethode:

@ Test openbare ongeldig whenGetUploadFileProgressUsingHttpClient_thenCorrect () gooit ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nieuwe HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("bestand", nieuw bestand ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "bestand.ext"); HttpEntity multipart = builder.build (); ProgressEntityWrapper.ProgressListener pListener = percentage -> assertFalse (Float.compare (percentage, 100)> 0); httpPost.setEntity (nieuwe ProgressEntityWrapper (multipart, pListener)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

We zullen ook de interface toevoegen ProgressListener waarmee we de voortgang van het uploaden kunnen observeren:

openbare statische interface ProgressListener {ongeldige voortgang (floatpercentage); }

En hier is onze uitgebreide versie van HttpEntityWrapper ProgressEntityWrapper“:

openbare klasse ProgressEntityWrapper breidt HttpEntityWrapper {privé ProgressListener-luisteraar uit; openbare ProgressEntityWrapper (HttpEntity-entiteit, ProgressListener-luisteraar) {super (entiteit); this.listener = luisteraar; } @Override public void writeTo (OutputStream outstream) gooit IOException {super.writeTo (nieuwe CountingOutputStream (outstream, listener, getContentLength ())); }} 

En de uitgebreide versie van FilterOutputStreamCountingOutputStream“:

openbare statische klasse CountingOutputStream breidt FilterOutputStream {privé ProgressListener-luisteraar uit; privé lang overgedragen; privé lange totalBytes; openbare CountingOutputStream (OutputStream uit, ProgressListener-luisteraar, lange totalBytes) {super (uit); this.listener = luisteraar; overgedragen = 0; this.totalBytes = totalBytes; } @Override public void write (byte [] b, int off, int len) gooit IOException {out.write (b, off, len); overgedragen + = len; listener.progress (getCurrentProgress ()); } @Override public void write (int b) gooit IOException {out.write (b); overgedragen ++; listener.progress (getCurrentProgress ()); } private float getCurrentProgress () {return ((float) overgedragen / totalBytes) * 100; }}

Let daar op:

  • Bij het verlengen FilterOutputStream naar "CountingOutputStream ”- we overschrijven de schrijven() methode om de geschreven (overgedragen) bytes te tellen
  • Bij het verlengen HttpEntityWrapper naar "ProgressEntityWrapper ”- we overschrijven de Schrijven aan() methode om onze "CountingOutputStream"

9. Conclusie

In deze tutorial hebben we de meest gebruikelijke manieren geïllustreerd om POST HTTP-verzoeken te verzenden met de Apache HttpClient 4.

We hebben geleerd hoe je een POST-verzoek met autorisatie kunt verzenden, hoe je kunt posten met HttpClient vloeiende API en hoe u een bestand uploadt en de voortgang ervan volgt.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in het github-project.