פרסום עם HttpClient

1. סקירה כללית

במדריך זה - נפרסם עם HttpClient 4 - באמצעות הרשאה ראשונה, ואז ממשק ה- API HttpClient השוטף.

לבסוף נדון כיצד להעלות קובץ באמצעות Httpclient.

2. POST בסיסי

ראשית, בוא נעבור על דוגמה פשוטה ונשלח בקשת POST באמצעות HttpClient.

נעשה POST עם שני פרמטרים - “שם משתמש"ו"סיסמה“:

@ מבחן ציבורי בטל כאשר SendPostRequestUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); רשימת פאראמים = ArrayList חדש (); params.add (חדש BasicNameValuePair ("שם משתמש", "ג'ון")); params.add (חדש BasicNameValuePair ("סיסמה", "לעבור")); httpPost.setEntity (UrlEncodedFormEntity חדש (params)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

שימו לב כיצד השתמשנו ב- רשימה שֶׁל NameValuePair לכלול פרמטרים בבקשת ה- POST.

3. הודעה עם הרשאה

לאחר מכן, בואו נראה כיצד לבצע פוסט עם אישורי אימות באמצעות ה- HttpClient.

בדוגמה הבאה - אנו שולחים בקשת POST לכתובת אתר המאובטחת באמצעות אימות בסיסי על ידי הוספת כותרת הרשאה:

@Test ציבורי בטל כאשר SendPostRequestWithAuthorizationUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException, AuthenticationException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); httpPost.setEntity (StringEntity חדש ("הודעת בדיקה")); UsernamePasswordCredentials creds = New UsernamePasswordCredentials ("John", "pass"); httpPost.addHeader (BasicScheme חדש (). אימות (זיכויים, httpPost, null)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

4. פרסם עם JSON

עכשיו - בואו נראה איך לשלוח בקשת POST עם גוף JSON באמצעות ה- HttpClient.

בדוגמה הבאה - אנו שולחים כמה אדם מידע (מזהה, שם) בתור JSON:

@Test ציבורי בטל כאשר PostJsonUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); מחרוזת json = "{" id ": 1," name ":" John "}"; ישות StringEntity = StringEntity חדש (json); httpPost.setEntity (ישות); httpPost.setHeader ("קבל", "application / json"); httpPost.setHeader ("סוג תוכן", "application / json"); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

שים לב כיצד אנו משתמשים ב- StringEntity לקבוע את גוף הבקשה.

אנחנו גם מגדירים את סוג תוכן כותרת אל יישום / jsonלתת לשרת את המידע הדרוש על ייצוג התוכן שאנו שולחים.

5. הודעה עם ממשק API HtpClient Fluent

לאחר מכן, בוא נפרסם עם HttpClient ממשק API שוטף.

אנו נשלח בקשה עם שני פרמטרים "שם משתמש"ו"סיסמה“:

@Test הציבור בטל כאשרPostFormUsingHttpClientFluentAPI_thenCorrect () זורק ClientProtocolException, IOException {HttpResponse response = Request.Post ("// www.example.com"). BodyForm (Form.form (). הוסף ("שם משתמש", "John"). ("סיסמה", "לעבור"). build ()). execute (). returnResponse (); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

6. POST בקשה מרובת חלקים

עכשיו, בוא נפרסם בקשה מרובת חלקים.

נפרסם a קוֹבֶץ, שם משתמש וסיסמה באמצעות MultipartEntityBuilder:

@ מבחן ציבורי בטל כאשר SendMultipartRequestUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addTextBody ("שם משתמש", "ג'ון"); builder.addTextBody ("סיסמה", "לעבור"); builder.addBinaryBody ("קובץ", קובץ חדש ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity מרובה חלקים = ​​builder.build (); httpPost.setEntity (מרובה חלקים); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

7. העלה א קוֹבֶץ באמצעות HttpClient

לאחר מכן, נראה כיצד להעלות a קוֹבֶץ משתמש ב HttpClient.

אנו מעלים את "test.txtקובץ באמצעות MultipartEntityBuilder:

@Test ציבורי בטל כאשר UploadFileUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("קובץ", קובץ חדש ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity מרובה חלקים = ​​builder.build (); httpPost.setEntity (מרובה חלקים); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

8. קבל קוֹבֶץ העלההתקדמות

לבסוף - בואו נראה כיצד ניתן להתקדם קוֹבֶץ העלה באמצעות HttpClient.

בדוגמה הבאה נרחיב את ה- HttpEntityWrapper כדי להשיג נראות לתהליך ההעלאה.

ראשית - הנה שיטת ההעלאה:

@ מבחן ציבורי בטל כאשר GetUploadFileProgressUsingHttpClient_thenCorrect () זורק ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = HttpPost חדש ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("קובץ", קובץ חדש ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity מרובה חלקים = ​​builder.build (); ProgressEntityWrapper.ProgressListener pListener = אחוז -> assertFalse (Float.compare (אחוז, 100)> 0); httpPost.setEntity (חדש ProgressEntityWrapper (מרובה חלקים, pListener)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

נוסיף גם את הממשק ProgressListener המאפשר לנו לצפות בהתקדמות ההעלאה:

ממשק סטטי ציבורי ProgressListener {התקדמות חלל (אחוז צף); }

והנה הגרסה המורחבת שלנו ל- HttpEntityWrapper ProgressEntityWrapper“:

מעמד ציבורי ProgressEntityWrapper מרחיב את HttpEntityWrapper {מאזין פרוגרסיסטר פרטי; ProgressEntityWrapper ציבורי (ישות HttpEntity, מאזין ProgressListener) {super (entity); this.listener = מאזין; } @Override public void writeTo (OutputStream outstream) זורק IOException {super.writeTo (CountingOutputStream חדש (outstream, מאזין, getContentLength ())); }} 

והגרסה המורחבת של FilterOutputStreamCountingOutputStream“:

מחלקה סטטית ציבורית CountingOutputStream מרחיב את FilterOutputStream {המאזין הפרטי של ProgressListener; פרטי שהועבר זמן רב; totalBytes פרטיים ארוכים; Public CountingOutputStream (OutputStream out, מאזין ProgressListener, totalBytes ארוך) {super (out); this.listener = מאזין; הועבר = 0; this.totalBytes = totalBytes; } @ עקוב בטל ציבורי בטל (בתים [] b, int off, int len) זורק IOException {out.write (b, off, len); הועבר + = len; listener.progress (getCurrentProgress ()); } @Override ריקה ציבורית לכתוב (int b) זורק IOException {out.write (b); הועבר ++; listener.progress (getCurrentProgress ()); } פרטי float getCurrentProgress () {החזר ((float) מועבר / totalBytes) * 100; }}

ציין זאת:

  • בעת הארכה FilterOutputStream ל "CountingOutputStream ”- אנו עוקפים את לִכתוֹב() שיטה לספור את הבתים הכתובים (שהועברו)
  • בעת הארכה HttpEntityWrapper ל "ProgressEntityWrapper ”- אנו עוקפים את לכתוב ל() שיטה להשתמש שלנו "CountingOutputStream"

9. מסקנה

במדריך זה, המחשנו את הדרכים הנפוצות ביותר לשלוח בקשות POST HTTP עם ה- Apache HttpClient 4.

למדנו כיצד לשלוח בקשת POST עם Authorization, כיצד לפרסם באמצעות HttpClient API שוטף וכיצד להעלות קובץ ולעקוב אחר התקדמותו.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט github.