{"id":325262,"date":"2021-06-21T21:00:16","date_gmt":"2021-06-21T21:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=325262"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=325262","title":{"rendered":"Retrofit: \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0445\u043e\u0447\u0435\u0442 \u0434\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0443\u0434\u043e\u0431\u0441\u0442\u0432 \u0438 \u043f\u043e\u043b\u044c\u0437\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 API \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c. \u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Java \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 API, \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u041e\u043d \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0438 DTO \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 .jar-\u0444\u0430\u0439\u043b\u0435 API \u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Retrofit, \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/562730\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4e\/vm\/uo\/4evmuo__apnnbzytteowsv9myyy.png\"><\/a><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 Java-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0442\u043e \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 <a href=\"https:\/\/www.w3.org\/TR\/wsdl.html\">WSDL<\/a> (Web Services Description Language, \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432), \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u043e\u044f\u0442 IBM \u0438 Microsoft. WSDL \u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 XML. \u0410, \u043c\u043e\u0436\u0435\u0442, \u0432\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u044d\u0442\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c? WSDL \u0438 \u0435\u0433\u043e \u0431\u0440\u0430\u0442-\u0431\u043b\u0438\u0437\u043d\u0435\u0446 \u2014 \u044f\u0437\u044b\u043a XML Schema, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0442\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c W3C, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043b\u044e\u0431\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u0438 \u0431\u044b\u0432\u0430\u043b\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u0424\u0430\u0439\u043b\u044b \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 WSDL \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c, \u0430 \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u0438\u0445 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0448\u0435 \u0438 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c. \u041d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (DTO, Data Transfer Object) \u0438 \u0441\u0442\u0430\u0431\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0426\u0435\u043b\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c. \u041d\u0438 \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 WSDL, \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u00ab\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043f\u043b\u0451\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0438\u0437 \u0432\u0430\u043d\u043d\u044b \u0441 \u0433\u0440\u044f\u0437\u043d\u043e\u0439 \u0432\u043e\u0434\u043e\u0439 \u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0435\u0431\u0451\u043d\u043a\u0430\u00bb, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c WSDL-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u00ab\u0432\u043e\u0434\u0430\u00bb, \u0430 \u0447\u0451\u0442\u043a\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u044d\u0442\u043e \u00ab\u0440\u0435\u0431\u0451\u043d\u043e\u043a\u00bb. \u041a\u0430\u043a \u0431\u044b \u043d\u0430\u043c \u043d\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u00ab\u0433\u0440\u044f\u0437\u043d\u043e\u0439 \u0432\u043e\u0434\u044b\u00bb, \u00ab\u0440\u0435\u0431\u0451\u043d\u043a\u0430\u00bb \u043c\u044b \u00ab\u0432\u044b\u043f\u043b\u0435\u0441\u043d\u0443\u0442\u044c\u00bb \u043d\u0435 \u043c\u043e\u0436\u0435\u043c. \u0418\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u043c\u043e\u0434\u044b \u0438\u0437-\u0437\u0430 \u0438\u0445 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u043d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0442\u0430\u043a\u0438\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u043e\u0441\u043a\u043e\u0448\u044c \u043e\u0431\u043b\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API \u043f\u0440\u043e\u0449\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>  \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 REST-\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u0430 \u0442\u0430\u043a \u0436\u0435 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f API \u043f\u0443\u0442\u0451\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f .jar-\u0444\u0430\u0439\u043b\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e DTO \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 Java-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (POJO, Plain Old Java Object) \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a API \u0432 \u0432\u0438\u0434\u0435 Java-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/li>\n<li>\u0418 REST-\u0441\u0435\u0440\u0432\u0435\u0440, \u0438 \u043f\u0440\u043e\u0435\u043a\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 .jar-\u0444\u0430\u0439\u043b\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c API. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Retrofit. \u0410 REST-\u0441\u0435\u0440\u0432\u0435\u0440 \u043b\u0438\u0448\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 DTO.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/font><\/h2>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/gitlab.com\/jsprengers\/spring-retrofit-demo\">\u044d\u0442\u043e\u043c<\/a> GitLab-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">git clone git@gitlab.com:jsprengers\/spring-retrofit-demo.git <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u2014 maven-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0438 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430: <b><font color=\"#3AC1EF\">service<\/font><\/b>, <b><font color=\"#3AC1EF\">api <\/font><\/b>\u0438 <b><font color=\"#3AC1EF\">integration<\/font><\/b>. \u0412\u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445:<\/p>\n<ul>\n<li><b><font color=\"#3AC1EF\">api<\/font><\/b>: \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 DTO \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 REST-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/li>\n<li> <b><font color=\"#3AC1EF\">service<\/font><\/b>: \u044d\u0442\u043e \u2014 REST-\u0441\u0435\u0440\u0432\u0438\u0441, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring Boot. \u041e\u043d, \u0432 \u043f\u043b\u0430\u043d\u0435 DTO, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430<b><font color=\"#3AC1EF\"> api <\/font><\/b>.<\/li>\n<li><b><font color=\"#3AC1EF\">integration<\/font><\/b>: \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b. \u041e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430 <b><font color=\"#3AC1EF\"> api <\/font><\/b> \u0432 \u043f\u043b\u0430\u043d\u0435 DTO \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 REST-\u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u043e\u0435\u043a\u0442 service<\/font><\/h2>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 DTO <code>Person<\/code>, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <b><font color=\"#3AC1EF\">api <\/font><\/b>. \u0422\u0443\u0442, \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Basic Authentication \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0440\u043e\u043b\u0438 \u2014 <b><font color=\"#3AC1EF\">user<\/font><\/b> \u0438 <b><font color=\"#3AC1EF\">admin<\/font><\/b>. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c <b><font color=\"#3AC1EF\">admin<\/font><\/b> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b <code>PUT<\/code>, POST \u0438 DELETE (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445), \u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c <b><font color=\"#3AC1EF\">user<\/font><\/b> \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0438\u0448\u044c \u0437\u0430\u043f\u0440\u043e\u0441 GET (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438\u0448\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435). \u041f\u0430\u0440\u043e\u043b\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0414\u043b\u044f \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 <b><font color=\"#3AC1EF\">user<\/font><\/b> \u0438 <b><font color=\"#3AC1EF\">admin<\/font><\/b>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0430\u0440\u043e\u043b\u0438 nosecret \u0438 secret. \u0422\u0443\u0442, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u0441\u0451 \u0436\u0435, \u044d\u0442\u043e \u2014 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<pre><code class=\"java\">@RestController @RequestMapping(&quot;api\/person&quot;) @RequiredArgsConstructor @Slf4j public class PersonController {  \u00a0\u00a0\u00a0\u00a0@Autowired \u00a0\u00a0\u00a0\u00a0private final PersonDAO personDAO;  \u00a0\u00a0\u00a0\u00a0@GetMapping \u00a0\u00a0\u00a0\u00a0List&lt;Person&gt; getAll(@RequestParam(value = &quot;fields&quot;, required = false) String fields) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return personDAO.getAll(fields); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0@GetMapping(&quot;\/{id}&quot;) \u00a0\u00a0\u00a0\u00a0Person getPersonById(@PathVariable(&quot;id&quot;) String id, @RequestParam(value = &quot;fields&quot;, required = false) String fields) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return personDAO.getById(id, fields).orElseThrow(() -&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new NotFoundException(&quot;No such ID: &quot; + id); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0@PostMapping \u00a0\u00a0\u00a0\u00a0void createPerson(@RequestBody Person person) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (personDAO.getById(person.getId(), null).isPresent()) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new IllegalArgumentException(&quot;Person with ID already exists: &quot; + person.getId()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log.info(&quot;Storing person with id {}&quot;, person.getId()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0personDAO.put(person); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0@PutMapping \u00a0\u00a0\u00a0\u00a0void upsertPerson(@RequestBody Person person) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0personDAO.put(person); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0@DeleteMapping(&quot;\/{id}&quot;) \u00a0\u00a0\u00a0\u00a0void deletePerson(@PathVariable(&quot;id&quot;) String id) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0personDAO.deleteById(id); \u00a0\u00a0\u00a0\u00a0}  } <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u043e\u0435\u043a\u0442 api<\/font><\/h2>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 <b><font color=\"#3AC1EF\">api<\/font><\/b> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f DTO \u0438\u0437 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u2014 <code>Person<\/code> \u0432 \u0432\u0438\u0434\u0435 POJO. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Lombok \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0451\u043c\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438) \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"java\">@Data @NoArgsConstructor @AllArgsConstructor @Builder(toBuilder = true) public class Person { \u00a0\u00a0\u00a0\u00a0private String id; \u00a0\u00a0\u00a0\u00a0private String name; \u00a0\u00a0\u00a0\u00a0private String address; \u00a0\u00a0\u00a0\u00a0private String email; } <\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 Java. \u041e\u043d\u0438, \u0432 \u0446\u0435\u043b\u043e\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0442\u0435\u043b \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0432 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"https:\/\/square.github.io\/retrofit\/\">Retrofit<\/a>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u044b \u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b. \u042d\u0442\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445.<\/p>\n<pre><code class=\"java\">public interface PersonAPIClient {  \u00a0\u00a0\u00a0\u00a0@GET(&quot;api\/person&quot;) \u00a0\u00a0\u00a0\u00a0Call&lt;List&lt;Person&gt;&gt; getAll(@Query(&quot;fields&quot;) String fields);  \u00a0\u00a0\u00a0\u00a0@GET(&quot;api\/person\/{id}&quot;) \u00a0\u00a0\u00a0\u00a0Call&lt;Person&gt; getPersonById(@Path(&quot;id&quot;) String id, @Query(&quot;fields&quot;) String fields);  \u00a0\u00a0\u00a0\u00a0@POST(&quot;api\/person&quot;) \u00a0\u00a0\u00a0\u00a0Call&lt;Void&gt; createPerson(@Body Person person);  \u00a0\u00a0\u00a0\u00a0@PUT(&quot;api\/person&quot;) \u00a0\u00a0\u00a0\u00a0Call&lt;Void&gt; upsertPerson(@Body Person person);  \u00a0\u00a0\u00a0\u00a0@DELETE(&quot;api\/person\/{id}&quot;) \u00a0\u00a0\u00a0\u00a0Call&lt;Void&gt; deletePerson(@Path(&quot;id&quot;) String id); } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b. \u041a\u0430\u043a \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0438\u0436\u0435 \u2014 \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Call<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041a\u043b\u0438\u0435\u043d\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0434\u0430\u0451\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u0435\u0437\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>Call<\/code>, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c REST-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 API. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u043e\u043c, \u0445\u043e\u0440\u043e\u0448\u043e \u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u043b\u044c \u0442\u0435\u0441\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u043d\u043e \u044d\u0442\u043e \u2014 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e.<\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u043e\u0435\u043a\u0442 integration<\/font><\/h2>\n<p>  \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u044b, \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a REST-\u0441\u0435\u0440\u0432\u0438\u0441\u0443, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e API \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432. \u041d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 <b><font color=\"#3AC1EF\">package<\/font><\/b> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <b><font color=\"#3AC1EF\">jib-maven-plugin<\/font><\/b>. \u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 <a href=\"https:\/\/www.testcontainers.org\/\">Testcontainers<\/a>.<\/p>\n<pre><code class=\"java\">public class PersonAPIContainerizedIntegrationTest {  \u00a0\u00a0\u00a0\u00a0private static AppContainer container; \u00a0\u00a0\u00a0\u00a0private static PersonAPIClient userClient; \u00a0\u00a0\u00a0\u00a0private static PersonAPIClient adminClient;  \u00a0\u00a0\u00a0\u00a0@BeforeAll \u00a0\u00a0\u00a0\u00a0public static void initialize() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0container = new AppContainer(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0container.startAndWait(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0440\u0442\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 localhost \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c container.getFirstMappedPort() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0RetrofitClientFactory retrofitClientFactory =\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new RetrofitClientFactory(container.getFirstMappedPort()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0userClient = retrofitClientFactory.authenticatedClient(&quot;user&quot;,&quot;nosecret&quot;); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0adminClient = retrofitClientFactory.authenticatedClient(&quot;admin&quot;, &quot;secret&quot;); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0@AfterAll public static void shutdown() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (container != null &amp;&amp; container.isRunning()) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0container.stop(); \u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0[ ... ] } <\/code><\/pre>\n<p>  <code>AppContainer<\/code> \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>GenericContainer<\/code> \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 <code>TestContainer<\/code>. <code>AppContainer<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 REST-\u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <code>service<\/code>.<\/p>\n<pre><code class=\"java\">public class AppContainer extends GenericContainer&lt;AppContainer&gt; {  \u00a0\u00a0\u00a0\u00a0public AppContainer() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0414\u043e\u043a\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 springboot-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u0442\u0435 8080, \u044d\u0442\u043e - \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0super(DockerImageName.parse(&quot;spring-retrofit-test-server:LATEST&quot;)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0withExposedPorts(8080); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0protected void startAndWait(){ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.start(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041f\u043e\u0440\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 8080 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443, \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e getFirstMappedPort() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u043e\u043d \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 api\/person. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.waitingFor(new HttpWaitStrategy() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.forPath(&quot;api\/person\/&quot;) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.forPort(getFirstMappedPort())); \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 REST-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Retrofit<\/font><\/h2>\n<p>  \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <b><font color=\"#3AC1EF\">Retrofit<\/font><\/b> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 REST-\u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0415\u0451 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 Builder. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041c\u044b, \u0432 \u0440\u043e\u043b\u0438 JSON-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Google GSON. \u0415\u0449\u0451 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/square.github.io\/okhttp\/\">OkHttpClient<\/a> \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u0445\u0435\u043c\u044b Basic Authentication. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f \u0440\u043e\u043b\u0435\u0439 user \u0438 admin. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u043e\u043b\u0435\u0439. \u041f\u043e\u0440\u0442, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432 URL, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>  \u041c\u044b, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>Retrofit.create<\/code> (<code>PersonApiClient<\/code> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <code>api<\/code>). \u0423\u0434\u043e\u0431\u043d\u043e, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u043c\u0435\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<pre><code class=\"java\">public class RetrofitClientFactory { \u00a0\u00a0\u00a0\u00a0private final int port;  \u00a0\u00a0\u00a0\u00a0PersonAPIClient authenticatedClient(String username, String password) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OkHttpClient okHttpClient = new OkHttpClient.Builder().authenticator( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(route, response) -&gt; response.request().newBuilder().header(&quot;Authorization&quot;, Credentials.basic(username, password)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.build()).build(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Retrofit retrofit = new Retrofit.Builder() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.baseUrl(String.format(&quot;http:\/\/localhost:%d\/&quot;, port)). \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0addConverterFactory(GsonConverterFactory.create()) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.client(okHttpClient) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.build(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return retrofit.create(PersonAPIClient.class); \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Retrofit<\/font><\/h2>\n<p>  \u0412\u043e\u0442 \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<pre><code class=\"java\">@Test \u00a0\u00a0\u00a0\u00a0public void EntityLifeCycleHappyFlow() throws IOException { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0executeCall(adminClient.createPerson(Person.builder().id(&quot;42&quot;).name(&quot;Jane&quot;).build())); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0executeCall(adminClient.createPerson(Person.builder().id(&quot;43&quot;).name(&quot;Jack&quot;).build())); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0assertThat(executeCall(userClient.getPersonById(&quot;42&quot;, null)).body().getName()).isEqualTo(&quot;Jane&quot;); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0assertThat(executeCall(userClient.getPersonById(&quot;43&quot;, null)).body().getName()).isEqualTo(&quot;Jack&quot;);  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Response&lt;List&lt;Person&gt;&gt; response = executeCall(userClient.getAll(null)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0assertThat(response.body()).hasSize(2);  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0executeCall(adminClient.upsertPerson(Person.builder().id(&quot;42&quot;).name(&quot;Jane&quot;).address(&quot;London&quot;).build())); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Person jane = executeCall(userClient.getPersonById(&quot;42&quot;, &quot;address,dateofBirth&quot;)).body(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0assertThat(jane.getAddress()).isEqualTo(&quot;London&quot;); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0executeCall(adminClient.deletePerson(&quot;42&quot;)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0assertThat(userClient.getAll(null).execute().body()).hasSize(1); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0private &lt;T&gt; Response&lt;T&gt; executeCall(Call&lt;T&gt; call) throws IOException { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Response&lt;T&gt; response = call.execute(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (!response.isSuccessful()) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fail(&quot;response returned &quot; + response.errorBody().string()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return response; \u00a0 \u00a0 } <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Retrofit. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0438 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Call<\/code>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>Response<\/code> \u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>execute()<\/code> \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041c\u0435\u0442\u043e\u0434 <code>executeCall()<\/code> \u2014 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 <code>RuntimeException<\/code>, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439. \u041e\u0431\u044a\u0435\u043a\u0442 <code>Response<\/code> \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<pre><code class=\"java\">\/\/ \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0440\u043e\u043b\u044c\u044e \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 POST assertThat(userClient.createPerson(Person.builder().id(&quot;42&quot;).name(&quot;Jane&quot;).build()).execute().code()).isEqualTo(403);  \/\/ \u0423\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441 id 42. Response&lt;Void&gt; personExists = adminClient.createPerson(Person.builder().id(&quot;42&quot;).name(&quot;Jane&quot;).build()).execute(); assertThat(personExists.code()).isEqualTo(400); assertThat(personExists.errorBody().string()).isEqualTo(&quot;Person with ID already exists: 42&quot;);  \/\/ \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c Response&lt;Void&gt; incompletePost = adminClient.createPerson(Person.builder().id(&quot;44&quot;).name(null).build()).execute(); assertThat(incompletePost.code()).isEqualTo(400); assertThat(incompletePost.errorBody().string()).isEqualTo(&quot;Person name cannot be null&quot;); <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0442\u043e\u0433\u0438<\/font><\/h2>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0438 \u0447\u0442\u043e \u0432\u044b \u043d\u0430\u0448\u043b\u0438 \u0432 \u043d\u0435\u0439 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e Retrofit \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/square.github.io\/retrofit\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u043a \u044d\u0442\u043e\u043c\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e, \u043e \u0447\u0451\u043c \u044f \u0442\u0443\u0442 \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438, \u0430 \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Retrofit \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432. \u042d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d-\u043a\u043e\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Retrofit, \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043c\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c. \u041e\u043d \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u0435\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c, \u0447\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a REST Assured.<\/p>\n<p>  \u041f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043b\u0438 \u0432\u044b Retrofit?<\/p>\n<p>  <a href=\"https:\/\/ruvds.com\/news\/read\/142?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=retrofit:_udobnye_razrabotka_i_testirovanie_api\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" width=\"100%\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fd2\/b54\/bc3\/fd2b54bc3722efda2cfd8dc052376907.jpg\"><\/div>\n<p><\/a><br \/>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=retrofit:_udobnye_razrabotka_i_testirovanie_api\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"><\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/562730\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/562730\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0445\u043e\u0447\u0435\u0442 \u0434\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0443\u0434\u043e\u0431\u0441\u0442\u0432 \u0438 \u043f\u043e\u043b\u044c\u0437\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 API \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c. \u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Java \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 API, \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u041e\u043d \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0438 DTO \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 .jar-\u0444\u0430\u0439\u043b\u0435 API \u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Retrofit, \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/562730\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4e\/vm\/uo\/4evmuo__apnnbzytteowsv9myyy.png\"><\/a><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 Java-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0442\u043e \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 <a href=\"https:\/\/www.w3.org\/TR\/wsdl.html\">WSDL<\/a> (Web Services Description Language, \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432), \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u043e\u044f\u0442 IBM \u0438 Microsoft. WSDL \u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 XML. \u0410, \u043c\u043e\u0436\u0435\u0442, \u0432\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u044d\u0442\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c? WSDL \u0438 \u0435\u0433\u043e \u0431\u0440\u0430\u0442-\u0431\u043b\u0438\u0437\u043d\u0435\u0446 \u2014 \u044f\u0437\u044b\u043a XML Schema, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0442\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c W3C, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043b\u044e\u0431\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u0438 \u0431\u044b\u0432\u0430\u043b\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u0424\u0430\u0439\u043b\u044b \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 WSDL \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c, \u0430 \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u0438\u0445 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0448\u0435 \u0438 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c. \u041d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (DTO, Data Transfer Object) \u0438 \u0441\u0442\u0430\u0431\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-325262","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=325262"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/325262\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=325262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=325262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=325262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}