Apollo-link: [рдлрд╝реАрдЪрд░] рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рдПрдЪрдЯреАрдЯреАрдкреА рдЬреАрдИрдЯреА рд╡рд┐рдзрд┐ рдЕрдирджреЗрдЦрд╛ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЬреВрди 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link

рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╣рдо HTTP рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдХреЙрд▓ рд▓рд╛рдн рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрдИрдЯреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдРрд╕реЗ рд╡рд░реНрдг рд╣реИрдВ рдЬреЛ рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдиреАрдЪреЗ рд╣рдо рдХреНрд╡реЗрд░реА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП graphql-tag рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рдХреНрд╡реЗрд░реА рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрд▓рд╛рдЗрдиреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

import gql from 'graphql-tag';

const HERO_QUERY = gql`
  query HERO_QUERY {
    hero {
      name
      friends {
        name
      }
    }
  }
`;

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рдореНрди HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ:

GET /graphql?query=query%20HERO_QUERY%20%7B%0A%20%20hero%20%7B%0A%20%20%20%20name%0A%20%20%20%20friends%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20__typename%0A%20%20%20%20%7D%0A%20%20%20%20__typename%0A%20%20%7D%0A%7D%0A&operationName=HERO_QUERY&variables=%7B%7D HTTP/1.1
Host: localhost:3000
Connection: keep-alive
content-type: application/json

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ GET рдХреНрд╡реЗрд░реА рд╣реИ:

GET /graphql?query=query%20HERO_QUERY%7Bhero%7Bname%20friends%7Bname%7D%7D%7D&operationName=HERO_QUERY&variables=%7B%7D HTTP/1.1
Host: localhost:3000
Connection: keep-alive
content-type: application/json

рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛/рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдпрджрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

https://github.com/apolographql/apolo-link/blob/951217bad34c91f89c1f167cc809bd0cc18fd922/packages/apollo-link-http/src/httpLink.ts#L198 -L203

рдХреЗ рд╢рд░реАрд░ rewriteURIForGET рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ encodeURIComponent ред

graphql рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИ stripIgnoredCharacters ред

рдкреИрдХреЗрдЬ graphql рдкрд╣рд▓реЗ рд╕реЗ рд╣реА apollo-link-http рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреНрд╡реЗрд░реА рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХреЛ рд╕реАрдзреЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдордиреЗ рдкреНрд░рд┐рдВрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдареАрдХ рдмрд╛рдж рд╕реНрдЯреНрд░рд┐рдкрдЗрдЧреНрдиреЛрд░рдб рдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://www.npmjs.com/package/patch-package рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http-common рдкреИрдЪрд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рдХрд░ рджреА рд╣реИ:

рдкреИрдЪ/рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http-common+0.2.13.patch

diff --git a/node_modules/apollo-link-http-common/lib/index.js b/node_modules/apollo-link-http-common/lib/index.js
index 05cd095..c79da1b 100644
--- a/node_modules/apollo-link-http-common/lib/index.js
+++ b/node_modules/apollo-link-http-common/lib/index.js
@@ -2,6 +2,7 @@
 Object.defineProperty(exports, "__esModule", { value: true });
 var tslib_1 = require("tslib");
 var printer_1 = require("graphql/language/printer");
+var utilities_1 = require("graphql/utilities/stripIgnoredCharacters");
 var ts_invariant_1 = require("ts-invariant");
 var defaultHttpOptions = {
     includeQuery: true,
@@ -91,6 +92,7 @@ exports.selectHttpOptionsAndBody = function (operation, fallbackConfig) {
         body.extensions = extensions;
     if (http.includeQuery)
         body.query = printer_1.print(query);
+        body.query = utilities_1.stripIgnoredCharacters(body.query);
     return {
         options: options,
         body: body,

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдмрд╛рд╣рд░ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ apollo-link-http рдПрдХ рдХрд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп ApolloLink рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрд╡реЗрд░реА рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдкрдЯреНрдЯреА createHttpLink рд▓реЗрдХрд┐рди рдХреЛрдИ рднрд╛рдЧреНрдп рджреБрд░реНрднрд╛рдЧреНрдп рдХреЗ рд╕рд╛рдеред

import { ApolloLink } from 'apollo-link';
import gql from 'graphql-tag';
import { print } from 'graphql/language/printer';
import { stripIgnoredCharacters } from 'graphql/utilities/stripIgnoredCharacters';

class CreateShortQueryLink extends ApolloLink {
  request(operation, forward) {
    const strippedQuery = stripIgnoredCharacters(print(operation.query));

    const request = {
      ...operation,
      getContext: operation.getContext,
      setContext: operation.setContext,
      query: gql(strippedQuery),
    };

    return forward(request);
  }
}

const link = ApolloLink.from([
  new CreateShortQueryLink(),
  createHttpLink({ uri: 'http://localhost:3000/graphql' }),
]);

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ print рдХрд╛ graphql/language/printer рдлрд┐рд░ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд░реНрдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

print(gql('query Posts{posts(orderBy:id_DESC){id title __typename}}'))

// outputs
query Posts{posts(orderBy:id_DESC){id title __typename}} query Posts {
  posts(orderBy: id_DESC) {
    id
    title
    __typename
  }
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ print рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ apollo-link-http-common рджреНрд╡рд╛рд░рд╛ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ GET рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП apollo-link-http рдЬрд╛рддрд╛ рд╣реИред

https://github.com/apollographql/apollo-link/blob/c32e170b72ae1a94cea1c633f977d2dbfcada0e1/packages/apollo-link-http-common/src/index.ts#L239

рдЙрдкрд░реЛрдХреНрдд рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

export const createMinifyLink = () => {
  return new ApolloLink((operation: Operation, forward: NextLink) => {
    const stripped = stripIgnoredCharacters(operation.query.loc!.source);
    return forward({
      ...operation,
      getContext: operation.getContext,
      setContext: operation.setContext,
      query: gql(stripped),
    });
  });
};

рд▓реЗрдХрд┐рди рдЯреБрдХрдбрд╝реЗ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХрд╛ рднрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдореИрдВ рдПрдХ HTTP рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдкреАрдХреНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬреЛ 44kb рд╣реИрдВ рдФрд░ %20%20%20 рднрд░реЗ рд╣реБрдП рд╣реИрдВред рд╕реЛрдЪреЗрдВ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЕрдирджреЗрдЦрд╛ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдзрд╛ рдЖрдХрд╛рд░ рд╣реЛрдЧрд╛ред

рдЖрдк рдЗрд╕реЗ рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ ApolloClient рд╕рд┐рд░реНрдл __typename рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕реБрдВрджрд░ рдмрдирд╛рддрд╛ рд╣реИ:

export function stripIgnoredCharactersGql(literals: string[], ...placeholders: any[]) {
  const strippedLiterals = literals.map(str => stripIgnoredCharacters(str));
  return gql(strippedLiterals, ...placeholders);
}

export const configQuery = stripIgnoredCharactersGql`
  query {
    hello {
      world
    }
  }
`;

рд╣рдордиреЗ рдкреНрд░рд┐рдВрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдареАрдХ рдмрд╛рдж рд╕реНрдЯреНрд░рд┐рдкрдЗрдЧреНрдиреЛрд░рдб рдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://www.npmjs.com/package/patch-package рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http-common рдкреИрдЪрд┐рдВрдЧ рд╕рдорд╛рдкреНрдд рдХрд░ рджреА рд╣реИ:

рдкреИрдЪ/рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http-common+0.2.13.patch

diff --git a/node_modules/apollo-link-http-common/lib/index.js b/node_modules/apollo-link-http-common/lib/index.js
index 05cd095..c79da1b 100644
--- a/node_modules/apollo-link-http-common/lib/index.js
+++ b/node_modules/apollo-link-http-common/lib/index.js
@@ -2,6 +2,7 @@
 Object.defineProperty(exports, "__esModule", { value: true });
 var tslib_1 = require("tslib");
 var printer_1 = require("graphql/language/printer");
+var utilities_1 = require("graphql/utilities/stripIgnoredCharacters");
 var ts_invariant_1 = require("ts-invariant");
 var defaultHttpOptions = {
     includeQuery: true,
@@ -91,6 +92,7 @@ exports.selectHttpOptionsAndBody = function (operation, fallbackConfig) {
         body.extensions = extensions;
     if (http.includeQuery)
         body.query = printer_1.print(query);
+        body.query = utilities_1.stripIgnoredCharacters(body.query);
     return {
         options: options,
         body: body,
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Kisepro picture Kisepro  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

j3ddesign picture j3ddesign  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Morantron picture Morantron  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tim-soft picture tim-soft  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vjpr picture vjpr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ