рдореБрдЦреНрдп рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдЧрд╛рдиреЗред рдЬрд╛рд╡рд╛ рдФрд░ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдЕрдиреБрд░реЛрдз


( рдЪрд┐рддреНрд░рдг )

99.9% рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдмрд╛рд╣рд░реА API рдФрд░ "рдЖрдкрдХреЗ рдЕрдкрдиреЗ" рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЛрд░реНрд╕реЗрдЬ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рд░ рдХреЛрдИ microservices рдорд╛рд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рдБред рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдпрд╛ рднреЗрдЬрдирд╛ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╡реЗ рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ 5 рддрд░реАрдХреЗ (рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдирд╣реАрдВ - рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рд╣рд╛рдБ? рдЖрдУ рдФрд░ рддреБрд▓рдирд╛ рдХрд░реЛ;)

0. рдкрд░рд┐рдЪрдп


рдЬреЛ рдХрд╛рд░реНрдп рд╣рдо рд╣рд▓ рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: рд╣рдореЗрдВ GET / POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдФрд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдореВрд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдкрд░ рдЯреЛрдХрди рдФрд░ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреЗрд╡рд▓ POST рдФрд░ GET, GET рдФрд░ POST, рдФрд░ рдЗрд╕реА рддрд░рд╣ 5 рдмрд╛рд░ рдпрд╛ рддреЛред
рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред

1. рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрд╛рд╡рд╛ рд╕рдорд╛рдзрд╛рди


рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдЕрдЧрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИред Java.net рдкреИрдХреЗрдЬ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо HttpURLConnection, URL рдФрд░ URLEconconder рд╣реИред

рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ GST, рдХрд┐ POST, рдЖрдкрдХреЛ рдПрдХ URL рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

final URL url = new URL("http://jsonplaceholder.typicode.com/posts?_limit=10"); final HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреЛ рдорд╕рд╛рд▓рд╛ рджреЗрдирд╛ рд╣реЛрдЧрд╛:

 con.setRequestMethod("GET"); con.setRequestProperty("Content-Type", "application/json"); con.setConnectTimeout(CONNECTION_TIMEOUT); con.setReadTimeout(CONNECTION_TIMEOUT); 

рдФрд░ рдПрдХ InputStream рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛ рд╣реИред

  try (final BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) { String inputLine; final StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } return content.toString(); } catch (final Exception ex) { ex.printStackTrace(); return ""; } 

рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдРрд╕рд╛ рдЙрддреНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИ (рдпрд╣ рдмрд╛рдж рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╣реА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ):

 [ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }, ... { "userId": 1, "id": 9, "title": "nesciunt iure omnis dolorem tempora et accusantium", "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas" }, { "userId": 1, "id": 10, "title": "optio molestias id quia eum", "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error" } ] 

POST рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╣рдо рди рдХреЗрд╡рд▓ рдПрдХ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 final Map<String, String> parameters = new HashMap<>(); parameters.put("title", "foo"); parameters.put("body", "bar"); parameters.put("userId", "1"); con.setDoOutput(true); final DataOutputStream out = new DataOutputStream(con.getOutputStream()); out.writeBytes(getParamsString(parameters)); out.flush(); out.close(); 

GetParamsString рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ:

 public static String getParamsString(final Map<String, String> params) { final StringBuilder result = new StringBuilder(); params.forEach((name, value) -> { try { result.append(URLEncoder.encode(name, "UTF-8")); result.append('='); result.append(URLEncoder.encode(value, "UTF-8")); result.append('&'); } catch (final UnsupportedEncodingException e) { e.printStackTrace(); } }); final String resultString = result.toString(); return !resultString.isEmpty() ? resultString.substring(0, resultString.length() - 1) : resultString; } 

рд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдкрд░, рд╣рдореЗрдВ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдорд┐рд▓рддреА рд╣реИ:

 { "title": "foo", "body": "bar", "userId": "1", "id": 101} 

рд╕реНрд░реЛрдд рдХрд╛ рд╕рдВрджрд░реНрдн рдЬрд┐рд╕реЗ рдЖрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

2. рдЕрдкрд╛рдЪреЗ HttpClient


рдпрджрд┐ рд╣рдо рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЖ рд░рд╣реЗ рд╣реИрдВ рдЕрдкрд╛рдЪреЗ рдХреЗ HttpClientред рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ JAR рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛, рдЬрдм рд╕реЗ рдореИрдВ рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ:

  <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency> 

рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╢реНрди HttpClient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ ( рд╕реНрд░реЛрдд ):

  final CloseableHttpClient httpclient = HttpClients.createDefault(); final HttpUriRequest httpGet = new HttpGet("http://jsonplaceholder.typicode.com/posts?_limit=10"); try ( CloseableHttpResponse response1 = httpclient.execute(httpGet) ){ final HttpEntity entity1 = response1.getEntity(); System.out.println(EntityUtils.toString(entity1)); } final HttpPost httpPost = new HttpPost("http://jsonplaceholder.typicode.com/posts"); final List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("title", "foo")); params.add(new BasicNameValuePair("body", "bar")); params.add(new BasicNameValuePair("userId", "1")); httpPost.setEntity(new UrlEncodedFormEntity(params)); try ( CloseableHttpResponse response2 = httpclient.execute(httpPost) ){ final HttpEntity entity2 = response2.getEntity(); System.out.println(EntityUtils.toString(entity2)); } httpclient.close(); 

рд╣рдореЗрдВ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдорд┐рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзрд╛ рдЬрд┐рддрдирд╛ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдореБрджреНрджреЗ рдореЗрдВ рд╡реЗ рдФрд░ рдХрд╣рд╛рдБ рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдЕрдкрд╛рдЪреЗ рдореЗрдВ рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

3. рдЕрдкрд╛рдЪреЗ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдПрдкреАрдЖрдИ


  <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>fluent-hc</artifactId> <version>4.5.6</version> </dependency> 

рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдХреЙрд▓ рдЕрдзрд┐рдХ рдкрдардиреАрдп ( рд╕реНрд░реЛрдд ) рдмрди рдЬрд╛рддреЗ рд╣реИрдВ:

  final Content getResult = Request.Get("http://jsonplaceholder.typicode.com/posts?_limit=10") .execute().returnContent(); System.out.println(getResult.asString()); final Collection<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("title", "foo")); params.add(new BasicNameValuePair("body", "bar")); params.add(new BasicNameValuePair("userId", "1")); final Content postResultForm = Request.Post("http://jsonplaceholder.typicode.com/posts") .bodyForm(params, Charset.defaultCharset()) .execute().returnContent(); System.out.println(postResultForm.asString()); 

рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ - рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдпрджрд┐ рд╣рдо рдкреНрд░рдкрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рднреА рдХреЗ рдкрд╕рдВрджреАрджрд╛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╢рд░реАрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  final Content postResult = Request.Post("http://jsonplaceholder.typicode.com/posts") .bodyString("{\"title\": \"foo\",\"body\":\"bar\",\"userId\": 1}", ContentType.APPLICATION_JSON) .execute().returnContent(); System.out.println(postResult.asString()); 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЙрд▓ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдврд╣ рдЧрдИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реИред

4. рд╕реНрдкреНрд░рд┐рдВрдЧ рд░реЗрд╕реНрдЯреЗрдордкреНрд▓реЗрдЯ


рдЖрдЧреЗ рдХреНрдпрд╛? рдЖрдЧреЗ рдХреЗ рдЕрдиреБрднрд╡ рдиреЗ рдореБрдЭреЗ рд╡рд╕рдВрдд рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рд╛ рджрд┐рдпрд╛ред рдФрд░, рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ, рд╡рд╕рдВрдд рдореЗрдВ рднреА рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп (рдЕрдЬреАрдм, рд╕рд╣реА? рдПрдХ рдХрд╛рдо, рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ - рдпрд╣ рднреА рдПрдХ рдЬрд░реВрд░рдд рд╣реИ! - рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ)ред рдФрд░ рдкрд╣рд▓рд╛ рд╕реЙрд▓реНрдпреВрд╢рди (рдмреЗрд╕рд┐рдХ) рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ рд╡реЛ рд╣реИ рд░реЗрд╕реНрдЯреЗрдордкреНрд▓реЗрдЯред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреВрд░реЗ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рдХрд╛ рдХрд╛рдлреА рд╣рд┐рд╕реНрд╕рд╛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдЧреИрд░-рдЖрд╡реЗрджрди рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдкреВрд░реЗ рд░рд╕реЛрдИрдШрд░ рдХреЛ рди рдЦреАрдВрдЪреЗрдВред рдФрд░ рдЕрдЧрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд╕рдВрдд рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реИ, рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдз рд░рд┐рд╕реНрдЯреЗрдордкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

  final RestTemplate restTemplate = new RestTemplate(); final String stringPosts = restTemplate.getForObject("http://jsonplaceholder.typicode.com/posts?_limit=10", String.class); System.out.println(stringPosts); 

рд╣реВрдбред рд▓реЗрдХрд┐рди! рдореИрдВ рдЕрдм рдПрдХ рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЛ рддрд╛рд░ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рд▓реЗрдХрд┐рди рддреИрдпрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ! рдкреЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ:

 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Builder; import lombok.Getter; import lombok.Setter; @Builder @Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) public class Post { private int id; private String title; private String body; private int userId; public String toString() { return String.format("\n id: %s \n title: %s \n body: %s \n userId: %s \n", id, title, body, userId); } } 

рдпрд╣рд╛рдВ:
рдмрд┐рд▓реНрдбрд░, рдЧреЗрдЯреНрдЯрд░, рд╕реЗрдЯрд░ - рд▓реЛрдореНрдмреЛрдХ рд╕реЗ рдЪреАрдиреА, рд╣рд╛рде рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд╣рд╛рдБ, рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИ, рдЖрд▓рд╕реНрдп рдорд╛рдБред
JsonIgnoreProperties - рддрд╛рдХрд┐ рдЕрдЬреНрдЮрд╛рдд рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдЙрди рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░ рдпрд╣ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ GET рдФрд░ POST рдЕрдиреБрд░реЛрдз ( рд╕реНрд░реЛрдд ) рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЧрдП рд╣реИрдВ:

  // Map it to list of objects final Post[] posts = restTemplate.getForObject("http://jsonplaceholder.typicode.com/posts?_limit=10", Post[].class); for (final Post post : posts) { System.out.println(post); } final Post postToInsert = Post.builder() .body("bar") .title("foo") .userId(1) .build(); final Post insertedPost = restTemplate.postForObject("http://jsonplaceholder.typicode.com/posts", postToInsert, Post.class); System.out.println(insertedPost); 

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рди рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреВрд▓ред рдЕрдм рд╣рдо RestTemplate рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреНрд╡реЗрд░реА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реЛред рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЕрдХреНрд╕рд░ PEBCAK (рдЪреЗрдпрд░ рдФрд░ рдХреАрдмреЛрд░реНрдб рдХреЗ рдмреАрдЪ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ) ...

5. рд╕реНрдкреНрд░рд┐рдВрдЧ рдлрд╝рд╛рдЗрди


рдФрд░ рдпрд╣рд╛рдВ рдЪрд░рдг Feign рдЖрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╡рд╕рдВрдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ Feign рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:

  <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.5.RELEASE</version> </dependency> 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдорд╕рд╛рд▓рд╛ рджреЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рдХ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╣рдореЗрдВ Feign ( рд╕реНрд░реЛрдд ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 @FeignClient(name = "jsonplaceholder", url = "http://jsonplaceholder.typicode.com", path = "/posts") public interface ApiClient { @RequestMapping(method = GET, value = "/", consumes = APPLICATION_JSON_VALUE) List<Post> getPosts(@RequestParam("_limit") final int postLimit); @RequestMapping(method = POST, value = "/", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) Post savePost(@RequestBody Post post); } 

рд╕реМрдВрджрд░реНрдп, рд╣реИ рдирд╛? рдФрд░ рд╣рд╛рдВ, рд░реЗрд╕реНрдЯреЗрдордкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЬреЛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд▓рд┐рдЦреЗ рдереЗ, рд╡реЗ рдпрд╣рд╛рдВ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВред

6. рдирд┐рд╖реНрдХрд░реНрд╖


рдкреНрд░рд╕реНрддреБрдд рдкрд╛рдВрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдХреЗрд╡рд▓ рд▓реЗрдЦрдХ рдХреЗ рдЕрдиреБрднрд╡ рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЙрдирд╕реЗ рдореБрд▓рд╛рдХрд╛рдд рдХреА рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЕрдм рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ Feign рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреАрд╡рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЖрдк рдореЙрдирд┐рдЯрд░ рдореЗрдВ рдЪрд┐рд▓реНрд▓рд╛ рд╕рдХреЗрдВ "<рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд╛рдо>, рдореИрдВ рдЖрдкрдХреЛ рдЪреБрдирддрд╛ рд╣реВрдВ!" - рдЙрдкрдпреЛрдЧ рдФрд░ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдерд╛ред рдЗрд╕ рдмреАрдЪ, Feignред

PS "рдЖрд▓рд╕реА" рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЙрддреНрдкрдиреНрди рдЧреНрд░рд╛рд╣рдХ рд╕реНрд╡реИрдЧрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЗрддрдиреА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рднреА рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдПрдВрдЯреЛрдореЛрд▓реЙрдЬрд┐рдХрд▓ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫреЗ рд╕реЗ рдЕрдзрд┐рдХ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ред

Source: https://habr.com/ru/post/hi423591/


All Articles