{"id":410896,"date":"2024-06-29T21:39:10","date_gmt":"2024-06-29T21:39:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=410896"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=410896","title":{"rendered":"<span>Apollo 3.0 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GraphQL \u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 apollo \u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0434 android.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Apollo \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f?<\/h3>\n<p>Apollo Android &#8212; \u044d\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 GraphQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 Kotlin \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GraphQL. \u042d\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u0430\u043c \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 GraphQL. Apollo \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u0430\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GraphQL.<\/p>\n<p><a href=\"https:\/\/github.com\/apollographql\/apollo-android\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Github<\/a><\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Empty Activity, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0435\u0433\u043e ApolloConfig_Example <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/eb8\/e06\/caa\/eb8e06caaadc0f38e1a2934c6083b2ca.jpg\" width=\"902\" height=\"652\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eb8\/e06\/caa\/eb8e06caaadc0f38e1a2934c6083b2ca.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/df7\/c57\/507\/df7c575076dc482bd1d5c38e0c457398.jpg\" width=\"902\" height=\"652\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/df7\/c57\/507\/df7c575076dc482bd1d5c38e0c457398.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0438\u0445 &#8216;common&#8217;, \u0438 &#8216;modules&#8217;,\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0434\u0443\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/da4\/e97\/4f0\/da4e974f00dc56216a87f99a49cadde6.jpg\" width=\"679\" height=\"558\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da4\/e97\/4f0\/da4e974f00dc56216a87f99a49cadde6.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c JS GraphQL \u043f\u043b\u0430\u0433\u0438\u043d &#8212; \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u044f\u0437\u044b\u043a\u0430, \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 GraphQL<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043b\u0430\u0433\u0438\u043d JS GraphQL<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/a98\/9e9\/212\/a989e9212c9f38d7acea0d2aa4577c25.jpg\" width=\"1024\" height=\"703\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a98\/9e9\/212\/a989e9212c9f38d7acea0d2aa4577c25.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d Apollo 3.0 \u0432\u043e \u0432\u0441\u0435\u0445 gradle \u0444\u0430\u0439\u043b\u0430\u0445 \u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445<\/p>\n<pre><code class=\"kotlin\">id 'com.apollographql.apollo3' version(\"3.0.0-alpha07\")<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043b\u0430\u0433\u0438\u043d Apollo 3.0<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/c3a\/eed\/2b7\/c3aeed2b702c1149ffaf8d7283646261.jpg\" width=\"526\" height=\"228\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c3a\/eed\/2b7\/c3aeed2b702c1149ffaf8d7283646261.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/40d\/46f\/0b1\/40d46f0b1e4c5010d09580c0ae1ed65c.jpg\" width=\"567\" height=\"214\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/40d\/46f\/0b1\/40d46f0b1e4c5010d09580c0ae1ed65c.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f apollo \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/p>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;app&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.app\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/schema.graphqls\"))     }<\/code><\/pre>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;common&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.common\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.module_1\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043a\u0435\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 .qraphql, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.         srcDir(file(\"src\/main\/java\/com\/alab\/module_1\/services\/\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.module_2\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043a\u0435\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 .qraphql, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.         srcDir(file(\"src\/main\/java\/com\/alab\/module_2\/services\/\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 &#8216;Sync Now&#8217;<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043d\u043e\u043f\u043a\u0430 &#8216;Sync Now&#8217;<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/672\/0e3\/ad5\/6720e3ad59bf4bd1a9946609c426ec8a.jpg\" width=\"319\" height=\"232\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/672\/0e3\/ad5\/6720e3ad59bf4bd1a9946609c426ec8a.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0438 &#8216;common&#8217;, &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<pre><code class=\"kotlin\">implementation \"com.apollographql.apollo3:apollo-runtime:3.0.0-alpha07\" implementation \"com.apollographql.apollo3:apollo-api:3.0.0-alpha07\"<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7cd\/af6\/1a7\/7cdaf61a7d44abb8cb76099ec2eec056.jpg\" width=\"636\" height=\"265\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7cd\/af6\/1a7\/7cdaf61a7d44abb8cb76099ec2eec056.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0412 Gradle \u0444\u0430\u0439\u043b\u0430\u0445 &#8216;app&#8217;, &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u044c &#8216;common&#8217;. \u041e\u043d \u0441\u0442\u0430\u043d\u0435\u0442  \u0432\u0438\u0434\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<pre><code class=\"kotlin\">implementation(project(\":common\"))<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0e2\/899\/858\/0e289985854d849ee345f2c8b6c80ff0.jpg\" width=\"452\" height=\"108\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0e2\/899\/858\/0e289985854d849ee345f2c8b6c80ff0.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0444\u0430\u0439\u043b\u0430 scheme.graphqls, \u044d\u0442\u043e \u0444\u0430\u0439\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435  \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u044b, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 &#8216;app&#8217;, &#8216;common&#8217;, &#8216;modules&#8217;.<\/p>\n<pre><code class=\"kotlin\">schema {   query: Query }  type Query {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432.\\n\\n\\n**Returns:**\\n\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0430\u0439\u0434\u0435\u043d.\"   employee(\"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.\" id: String): Employee }  \"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.\" type Employee @source(name: \"Employee\", schema: \"Employees\") {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"   id: String   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0438\u043c\u044f.\"   fullName: String!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440.\"   personnelNumber: String!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435.\"   workStatus: Employees_WorkingPeriod! }  \"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0435\u0440\u0438\u043e\u0434.\" type Employees_WorkingPeriod @source(name: \"NonWorkingPeriod\", schema: \"Employees\") {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430.\"   beginDate: DateTime!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u0442\u0443 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f.\"   endDate: DateTime! }  \"Annotates the original name of a type.\" directive @source(\"The original name of the annotated type.\" name: Name! \"The name of the schema to which this type belongs to.\" schema: Name!) repeatable on ENUM | OBJECT | INTERFACE | UNION | INPUT_OBJECT | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION | ENUM_VALUE  \"The name scalar represents a valid GraphQL name as specified in the spec and can be used to refer to fields or types.\" scalar Name  \"The `DateTime` scalar represents an ISO-8601 compliant date time type.\" scalar DateTime @specifiedBy(url: \"https:\\\/\\\/www.graphql-scalars.com\\\/date-time\")<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 &#8216;common&#8217; \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 &#8216;ApolloClient&#8217;, \u0432 \u043d\u0435\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u043d \u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c.<\/p>\n<pre><code>\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 Apollo.  *\/ val apolloClient = ApolloClient(     networkTransport = HttpNetworkTransport(         serverUrl = \"https:\/\/your_url.com\/api\/graphQl\",   \/\/\u0410\u0434\u0440\u0435\u0441\u0441 \u0412\u0430\u0448\u0435\u0433\u043e Api         okHttpClient = OkHttpClient.Builder()             .addInterceptor(Interceptor { chain ->                 val newRequestBuilder = chain.request().newBuilder()                 newRequestBuilder.apply {                     addHeader(                         \"Authorization\",                         \"Bearer &lt;Your Token>\"   \/\/\u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d                     )                     addHeader(\"Content-Type\", \"application\/json\")                         .build()                 }                 val newRequest = newRequestBuilder.build()                 return@Interceptor chain.proceed(newRequest)             }).build()     ) )     .withCustomScalarAdapter(DateTime.type, dateTimeAdapter)<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 &#8216;GraphqlAdapters&#8217;, \u0432 \u043d\u0435\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 DateTime, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c, \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Date.<\/p>\n<pre><code class=\"kotlin\">\/**  * \u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f Any \u0432 Date.  *\/ val dateTimeAdapter = object : Adapter&lt;Date> {     override fun fromJson(reader: JsonReader, customScalarAdapters: CustomScalarAdapters): Date {         val source = reader.nextString()         val date: Date = SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.S'Z'\", Locale.getDefault())             .parse(source) ?: throw RuntimeException(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 '${source}' \u0432 \u0434\u0430\u0442\u0443\")         return date     }      override fun toJson(writer: JsonWriter, customScalarAdapters: CustomScalarAdapters, value: Date) {         AnyAdapter.toJson(writer, value)     } }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a module_1 \u0438 module_2, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b  \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0447\u0442\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430.<br \/>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b &#8216;GetEmployee.graphql&#8217;, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 scheme.graphqls \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 apollo \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 &#8216;GetEmployee.graphql&#8217; \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<pre><code class=\"kotlin\">query GetEmployee($id: String) {     employee(id: $id) {         id,         fullName,         personnelNumber,         workStatus {             beginDate,             endDate         }     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 ApiService \u0438 c\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IApiService, \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8216;IApiService&#8217;<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a api.  *\/ interface IApiService {      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 id.      * @param id \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.      *\/     suspend fun getEmployee(id: String): GetEmployeeQuery.Employee?  }<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 &#8216;ApiService&#8217;<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a api.  * @param apolloClient Apollo client.  *\/ class ApiService(     private val apolloClient: ApolloClient, ) : IApiService {      override suspend fun getEmployee(id: String): GetEmployeeQuery.Employee? {         return apolloClient.query(GetEmployeeQuery(id)).data?.employee     }  }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430, \u0430 \u0432 \u043d\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u044d\u043a\u0440\u0430\u043d\u0430.  *\/ class ModuleFragment : Fragment() {      override fun onCreateView(         inflater: LayoutInflater,         container: ViewGroup?,         savedInstanceState: Bundle?     ): View {         return View(requireContext())     }      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {         super.onViewCreated(view, savedInstanceState)          GlobalScope.launch {             val employeeResponse = apolloClient.query(GetEmployeeQuery(\"12345\")).data?.employee         }      } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 module_1 \u0438 module_2<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ac4\/79f\/dfe\/ac479fdfecc97c4fab4a4b9b23c4226c.jpg\" width=\"354\" height=\"274\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac4\/79f\/dfe\/ac479fdfecc97c4fab4a4b9b23c4226c.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p><a href=\"https:\/\/github.com\/AndroidLab\/ApolloConfig_Example\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043c\u043e\u0435\u043c GitHub<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/582552\/\"> https:\/\/habr.com\/ru\/articles\/582552\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 apollo \u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0434 android.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Apollo \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f?<\/h3>\n<p>Apollo Android &#8212; \u044d\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 GraphQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 Kotlin \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GraphQL. \u042d\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u0430\u043c \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 GraphQL. Apollo \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432\u0430\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GraphQL.<\/p>\n<p><a href=\"https:\/\/github.com\/apollographql\/apollo-android\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Github<\/a><\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Empty Activity, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0435\u0433\u043e ApolloConfig_Example <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0438\u0445 &#8216;common&#8217;, \u0438 &#8216;modules&#8217;,\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0434\u0443\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c JS GraphQL \u043f\u043b\u0430\u0433\u0438\u043d &#8212; \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u044f\u0437\u044b\u043a\u0430, \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 GraphQL<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043b\u0430\u0433\u0438\u043d JS GraphQL<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d Apollo 3.0 \u0432\u043e \u0432\u0441\u0435\u0445 gradle \u0444\u0430\u0439\u043b\u0430\u0445 \u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445<\/p>\n<pre><code class=\"kotlin\">id 'com.apollographql.apollo3' version(\"3.0.0-alpha07\")<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043b\u0430\u0433\u0438\u043d Apollo 3.0<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f apollo \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/p>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;app&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.app\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/schema.graphqls\"))     }<\/code><\/pre>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;common&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.common\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<p>\u0414\u043b\u044f gradle \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044f &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.module_1\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043a\u0435\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 .qraphql, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.         srcDir(file(\"src\/main\/java\/com\/alab\/module_1\/services\/\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<pre><code class=\"kotlin\">apollo {         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.         packageName.set(\"com.alab.module_2\")         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 (\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).         schemaFile.set(file(\"..\/..\/schema.graphqls\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043a\u0435\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 .qraphql, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0432\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.         srcDir(file(\"src\/main\/java\/com\/alab\/module_2\/services\/\"))         \/\/\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0438\u0437 graphql \u0441\u0445\u0435\u043c\u044b \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443.         customScalarsMapping = [                 \"DateTime\" : \"java.util.Date\"         ]     }<\/code><\/pre>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 &#8216;Sync Now&#8217;<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043d\u043e\u043f\u043a\u0430 &#8216;Sync Now&#8217;<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0438 &#8216;common&#8217;, &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217;<\/p>\n<pre><code class=\"kotlin\">implementation \"com.apollographql.apollo3:apollo-runtime:3.0.0-alpha07\" implementation \"com.apollographql.apollo3:apollo-api:3.0.0-alpha07\"<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0412 Gradle \u0444\u0430\u0439\u043b\u0430\u0445 &#8216;app&#8217;, &#8216;module_1&#8217; \u0438 &#8216;module_2&#8217; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u044c &#8216;common&#8217;. \u041e\u043d \u0441\u0442\u0430\u043d\u0435\u0442  \u0432\u0438\u0434\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<pre><code class=\"kotlin\">implementation(project(\":common\"))<\/code><\/pre>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0444\u0430\u0439\u043b\u0430 scheme.graphqls, \u044d\u0442\u043e \u0444\u0430\u0439\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435  \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u044b, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 &#8216;app&#8217;, &#8216;common&#8217;, &#8216;modules&#8217;.<\/p>\n<pre><code class=\"kotlin\">schema {   query: Query }  type Query {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432.\\n\\n\\n**Returns:**\\n\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0430\u0439\u0434\u0435\u043d.\"   employee(\"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.\" id: String): Employee }  \"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.\" type Employee @source(name: \"Employee\", schema: \"Employees\") {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"   id: String   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0438\u043c\u044f.\"   fullName: String!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440.\"   personnelNumber: String!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435.\"   workStatus: Employees_WorkingPeriod! }  \"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0435\u0440\u0438\u043e\u0434.\" type Employees_WorkingPeriod @source(name: \"NonWorkingPeriod\", schema: \"Employees\") {   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430.\"   beginDate: DateTime!   \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u0442\u0443 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f.\"   endDate: DateTime! }  \"Annotates the original name of a type.\" directive @source(\"The original name of the annotated type.\" name: Name! \"The name of the schema to which this type belongs to.\" schema: Name!) repeatable on ENUM | OBJECT | INTERFACE | UNION | INPUT_OBJECT | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION | ENUM_VALUE  \"The name scalar represents a valid GraphQL name as specified in the spec and can be used to refer to fields or types.\" scalar Name  \"The `DateTime` scalar represents an ISO-8601 compliant date time type.\" scalar DateTime @specifiedBy(url: \"https:\\\/\\\/www.graphql-scalars.com\\\/date-time\")<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 &#8216;common&#8217; \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 &#8216;ApolloClient&#8217;, \u0432 \u043d\u0435\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u043d \u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c.<\/p>\n<pre><code>\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 Apollo.  *\/ val apolloClient = ApolloClient(     networkTransport = HttpNetworkTransport(         serverUrl = \"https:\/\/your_url.com\/api\/graphQl\",   \/\/\u0410\u0434\u0440\u0435\u0441\u0441 \u0412\u0430\u0448\u0435\u0433\u043e Api         okHttpClient = OkHttpClient.Builder()             .addInterceptor(Interceptor { chain ->                 val newRequestBuilder = chain.request().newBuilder()                 newRequestBuilder.apply {                     addHeader(                         \"Authorization\",                         \"Bearer &lt;Your Token>\"   \/\/\u0412\u0430\u0448 \u0442\u043e\u043a\u0435\u043d                     )                     addHeader(\"Content-Type\", \"application\/json\")                         .build()                 }                 val newRequest = newRequestBuilder.build()                 return@Interceptor chain.proceed(newRequest)             }).build()     ) )     .withCustomScalarAdapter(DateTime.type, dateTimeAdapter)<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 &#8216;GraphqlAdapters&#8217;, \u0432 \u043d\u0435\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 DateTime, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0445\u0435\u043c\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c, \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Date.<\/p>\n<pre><code class=\"kotlin\">\/**  * \u0410\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f Any \u0432 Date.  *\/ val dateTimeAdapter = object : Adapter&lt;Date> {     override fun fromJson(reader: JsonReader, customScalarAdapters: CustomScalarAdapters): Date {         val source = reader.nextString()         val date: Date = SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.S'Z'\", Locale.getDefault())             .parse(source) ?: throw RuntimeException(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 '${source}' \u0432 \u0434\u0430\u0442\u0443\")         return date     }      override fun toJson(writer: JsonWriter, customScalarAdapters: CustomScalarAdapters, value: Date) {         AnyAdapter.toJson(writer, value)     } }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a module_1 \u0438 module_2, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b  \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0447\u0442\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430.<br \/>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b &#8216;GetEmployee.graphql&#8217;, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 scheme.graphqls \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 apollo \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 &#8216;GetEmployee.graphql&#8217; \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<pre><code class=\"kotlin\">query GetEmployee($id: String) {     employee(id: $id) {         id,         fullName,         personnelNumber,         workStatus {             beginDate,             endDate         }     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 ApiService \u0438 c\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IApiService, \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8216;IApiService&#8217;<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a api.  *\/ interface IApiService {      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 id.      * @param id \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430.      *\/     suspend fun getEmployee(id: String): GetEmployeeQuery.Employee?  }<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 &#8216;ApiService&#8217;<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a api.  * @param apolloClient Apollo client.  *\/ class ApiService(     private val apolloClient: ApolloClient, ) : IApiService {      override suspend fun getEmployee(id: String): GetEmployeeQuery.Employee? {         return apolloClient.query(GetEmployeeQuery(id)).data?.employee     }  }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430, \u0430 \u0432 \u043d\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u044d\u043a\u0440\u0430\u043d\u0430.  *\/ class ModuleFragment : Fragment() {      override fun onCreateView(         inflater: LayoutInflater,         container: ViewGroup?,         savedInstanceState: Bundle?     ): View {         return View(requireContext())     }      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {         super.onViewCreated(view, savedInstanceState)          GlobalScope.launch {             val employeeResponse = apolloClient.query(GetEmployeeQuery(\"12345\")).data?.employee         }      } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 module_1 \u0438 module_2<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p><a href=\"https:\/\/github.com\/AndroidLab\/ApolloConfig_Example\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043c\u043e\u0435\u043c GitHub<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/582552\/\"> https:\/\/habr.com\/ru\/articles\/582552\/<\/a><br \/><\/br><\/br><\/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-410896","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/410896","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=410896"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/410896\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=410896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=410896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=410896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}