Udstationering med HttpClient

1. Oversigt

I denne vejledning - vi POSTER med HttpClient 4 - ved hjælp af først godkendelse, derefter det flydende HttpClient API.

Endelig vil vi diskutere, hvordan man uploader en fil ved hjælp af Httpclient.

2. Grundlæggende POST

Lad os først gå over et simpelt eksempel og sende en POST-anmodning ved hjælp af HttpClient.

Vi laver en POST med to parametre - “brugernavn”Og“adgangskode“:

@Test offentlig ugyldig nårSendPostRequestUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); Listeparametre = ny ArrayList (); params.add (nyt BasicNameValuePair ("brugernavn", "John")); params.add (ny BasicNameValuePair ("adgangskode", "pass")); httpPost.setEntity (ny UrlEncodedFormEntity (params)); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Bemærk hvordan vi brugte en Liste af NameValuePair for at inkludere parametre i POST-anmodningen.

3. POST med autorisation

Lad os derefter se, hvordan man laver en POST med godkendelsesoplysninger ved hjælp af HttpClient.

I det følgende eksempel sender vi en POST-anmodning til en URL, der er sikret med grundlæggende godkendelse ved at tilføje en autorisationsoverskrift:

@Test offentlig ugyldig nårSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException, AuthenticationException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); httpPost.setEntity (ny StringEntity ("testindlæg")); UsernamePasswordCredentials creds = nyt brugernavnPasswordCredentials ("John", "pass"); httpPost.addHeader (ny BasicScheme (). godkende (creds, httpPost, null)); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

4. POST med JSON

Lad os nu se, hvordan du sender en POST-anmodning med et JSON-organ ved hjælp af HttpClient.

I det følgende eksempel sender vi nogle person Information (id, navn) som JSON:

@Test offentlig ugyldig nårPostJsonUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); String json = "{" id ": 1," name ":" John "}"; StringEntity-enhed = ny StringEntity (json); httpPost.setEntity (enhed); httpPost.setHeader ("Accepter", "applikation / json"); httpPost.setHeader ("Content-type", "application / json"); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Bemærk hvordan vi bruger StringEntity for at indstille anmodningens brødtekst.

Vi indstiller også Indholdstype header til ansøgning / jsonfor at give serveren de nødvendige oplysninger om repræsentationen af ​​det indhold, vi sender.

5. POST Med HttpClient Flydende API

Lad os derefter POST med HttpClient Flydende API.

Vi sender en anmodning med to parametre “brugernavn”Og“adgangskode“:

@Test offentlig ugyldig nårPostFormUsingHttpClientFluentAPI_thenCorrect () kaster ClientProtocolException, IOException {HttpResponse respons = Request.Post ("// www.example.com"). BodyForm (Form.form (). Tilføj ("brugernavn", "John"). Tilføj. ("password", "pass"). build ()). execute (). returnResponse (); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); }

6. POST anmodning om multipart

Lad os nu POSTE en anmodning om flere dele.

Vi sender et Fil, brugernavn og adgangskode ved hjælp af MultipartEntityBuilder:

@Test offentlig ugyldigt nårSendMultipartRequestUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addTextBody ("brugernavn", "John"); builder.addTextBody ("adgangskode", "pass"); builder.addBinaryBody ("fil", ny fil ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (multipart); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

7. Upload en Fil Ved brug af HttpClient

Lad os derefter se, hvordan man uploader en Fil bruger HttpClient.

Vi uploader “test.txt”Fil ved hjælp af MultipartEntityBuilder:

@Test offentlig ugyldig nårUploadFileUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("fil", ny fil ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (multipart); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

8. Få Fil UploadFremskridt

Endelig - lad os se, hvordan man får fremskridt med Fil upload ved hjælp af HttpClient.

I det følgende eksempel udvider vi HttpEntityWrapper for at få synlighed i uploadprocessen.

Først - her er uploadmetoden:

@Test offentlig ugyldig nårGetUploadFileProgressUsingHttpClient_thenCorrect () kaster ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = ny HttpPost ("// www.eksempel.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("fil", ny fil ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); ProgressEntityWrapper.ProgressListener pListener = procentdel -> assertFalse (Float.compare (procent, 100)> 0); httpPost.setEntity (ny ProgressEntityWrapper (multipart, pListener)); CloseableHttpResponse respons = client.execute (httpPost); assertThat (respons.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Vi tilføjer også grænsefladen ProgressListener der gør det muligt for os at observere uploadforløbet:

offentlig statisk grænseflade ProgressListener {ugyldig status (flydeprocent); }

Og her er vores udvidede version af HttpEntityWrapper ProgressEntityWrapper“:

offentlig klasse ProgressEntityWrapper udvider HttpEntityWrapper {privat ProgressListener-lytter; offentlig ProgressEntityWrapper (HttpEntity-enhed, ProgressListener-lytter) {super (enhed); this.listener = lytter; } @ Override public void writeTo (OutputStream outstream) kaster IOException {super.writeTo (ny CountingOutputStream (outstream, lytter, getContentLength ())); }} 

Og den udvidede version af FilterOutputStreamCountingOutputStream“:

offentlig statisk klasse CountingOutputStream udvider FilterOutputStream {privat ProgressListener-lytter; privat lang overført; private lange totalBytes; public CountingOutputStream (OutputStream out, ProgressListener listener, long totalBytes) {super (out); this.listener = lytter; overført = 0; this.totalBytes = totalBytes; } @Override public void write (byte [] b, int off, int len) kaster IOException {out.write (b, off, len); overført + = len; listener.progress (getCurrentProgress ()); } @ Overstyr offentlig ugyldig skrivning (int b) kaster IOException {out.write (b); overført ++; listener.progress (getCurrentProgress ()); } privat float getCurrentProgress () {return ((float) overført / totalBytes) * 100; }}

Noter det:

  • Ved udvidelse FilterOutputStream til "CountingOutputStream ”- vi tilsidesætter skrive() metode til at tælle de skrevne (overførte) bytes
  • Ved udvidelse HttpEntityWrapper til "ProgressEntityWrapper ”- vi tilsidesætter skrive til() metode til at bruge vores “CountingOutputStream”

9. Konklusion

I denne vejledning illustrerede vi de mest almindelige måder at sende POST HTTP-anmodninger med Apache HttpClient 4.

Vi lærte, hvordan man sender en POST-anmodning med autorisation, hvordan man sender med HttpClient flydende API og hvordan man uploader en fil og sporer dens fremskridt.

Implementeringen af ​​alle disse eksempler og kodestykker findes i github-projektet.


$config[zx-auto] not found$config[zx-overlay] not found