рдбреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, fetchOptions
рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреА рд╡рд┐рдзрд┐ рдХреЛ GET
рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд╡реЗрд░реА рдХреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде GET рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ Chrome рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрдЪреНрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо:
рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ GET рд╣реИ, рддреЛ рдПрдХ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо:
рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВ:
client.query({
context: {
fetchOptions: {
method: 'GET',
},
},
query: QUERY,
variables: { query },
})
@szdc рд╣рд╛рдБ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ? https://github.com/apolographql/apolo-link/issues/257 рдЬреИрд╕рд╛ рдХреБрдЫ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?
cc @arackaf @outlaw11a @puttyman рдЬрд┐рдирдХреА рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ! рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдЪрд╛рд╣реЗ рддреЛ рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред
@szdc @arackaf рддреЛ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ! рдореИрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ рдкрд░реАрдХреНрд╖рдг рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@szdc @Outlaw11A @arackaf рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:
const customFetch = (uri, options) => {
const { body, ...newOptions } = options;
const queryString = objectToQuery(JSON.parse(body));
requestedString = uri + queryString;
return fetch(requestedString, newOptions);
};
const link = createHttpLink({
uri: "data",
fetchOptions: { method: "GET" },
fetch: customFetch
});
@jbaxleyiii рдЬреЛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдмрд╕ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдХрд╣рд╛рдБ рд╕реЗ objectToQuery рдЖ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП npm рдкрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реЛрд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ - рдореВрд▓ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ.рдХреА рдХреЛ рдореИрдк рдХрд░реЗрдВ
escapeUriComponnt(`${k}=${obj[k]}`).join("&");
рдпрд╛ рдРрд╕рд╛ рд╣реА рдХреБрдЫ
https://www.apollographql.com/docs/link/links/http.html#Sending -GET-requests-custom-fetching
@arackaf рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ:
// turn the object into a query string, try object-to-querystring package
@jbaxleyiii рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ!
рдореБрдЭреЗ рдмрд╕ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдХреНрд╡реЗрд░реАрд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛:
http://localhost/graphql?operationName=AllPlayersQuery&variables=%5Bobject%20Object%5D&query=query%20All...
рдЗрд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ: variables=%5Bobject%20Object%5D
рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ?
рдпрд╣ рдорд╛рдирдХ рдпреВрдЖрд░рдЖрдИ рдХреНрд░рдордмрджреНрдзрддрд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ - рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдорд╛рдирдХ рдпреВрдЖрд░рдЖрдИ? рдпрд╣: %5Bobject%20Object%5D
?
encodeURIComponent('books(title:"Hello World"){Book{title}}')
books(title%3A%22Hello%20World%22)%7BBook%7Btitle%7D%7D
рдЕрдкреЛрд▓реЛ рдореЗрдВ рдореЗрд░реА рдХреНрд╡реЗрд░реА рд╣реИ:
query AllPlayers {
players {
id
name
surname
}
рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ @jbaxleyiii рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦрд╛рд▓реА [Object object]
рдЪрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдПрдХ рдмреЗрдпрд░рдмреЛрди рд░рд┐рдПрдХреНрдЯ рдРрдк (рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрдЯ-рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рд╣реИ рдЬреЛ GET рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - index.js
: https://github.com/usefulio/example-graphql-via-get-react-app
@johnunclesam рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ variables
рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдмрд╕ рдПрдХ рд╕рд╢рд░реНрдд JSON.stringify
рдЬреЛрдбрд╝рдХрд░ рдЕрдкрдиреА рдХрд╕реНрдЯрдо рдлрд╝реЗрдЪ рд╡рд┐рдзрд┐ (рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд) рдХреЛ рдЯреНрдпреВрди рдХрд┐рдпрд╛:
const customFetch = (uri, options) => {
const {body, ...newOptions} = options;
const parsedBody = JSON.parse(body);
const command = omitBy(parsedBody, isEmpty);
if (command.variables) {
command.variables = JSON.stringify(command.variables);
}
const requestedString = uri + '?' + queryString.stringify(command);
return fetch(requestedString, newOptions);
};
рддреЛ useGETForQueries
рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? useGETForQueries=true
рд╣реЛрдиреЗ рдкрд░ рдХрд╕реНрдЯрдо рдлрд╝реЗрдЪ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛?
рдореИрдВ рдХреНрд╡реЗрд░реА рдФрд░ рдореНрдпреВрдЯреЗрд╢рди рдореЗрдВ рдЕрдВрддрд░ рдХреИрд╕реЗ рдХрд░реВрдБ? рдореИрдВ рдХреЗрд╡рд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП GET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (DNS рдХреИрд╢ рдХреЗ рд▓рд┐рдП)ред
рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ useGETForQueries рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ https://github.com/apollographql/apollo-link/pull/510 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрдо, useGETForQueries рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдмрдЧ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:
let {
uri = '/graphql',
// use default global fetch if nothing passed in
fetch: fetcher,
includeExtensions,
useGETForQueries,
...requestOptions
} = linkOptions;
рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
let {
uri = '/graphql',
// use default global fetch if nothing passed in
fetch: fetcher,
includeExtensions,
fetchOptions,
...requestOptions
} = linkOptions;
let {
useGETForQueries
} = fetchOptions;
рдЖрдк рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ? рдЖрдк createHttpLink
рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдКрдкрд░ рдореЗрд░рд╛ рдЕрд╡рд▓реЛрдХрди рдПрдХ рдбреАрдмрдЧрд░ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрджрдо рдЙрдард╛рдиреЗ рд╕реЗ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд┐рд╕ рдХреЛрдб рдкрд░ рд╣рдордиреЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рд╡рд╣ рдпрд╣ рд╣реИ:
import omitBy from 'lodash.omitby';
import isEmpty from 'lodash.isempty';
const graphQLUrl = 'http://the.server.com/graphql';
const customFetch = (uri, options) => {
const { body, credentials, headers, ...newOptions } = options;
let fetchUri = uri;
if (body) {
const parsedBody = JSON.parse(body);
const command = omitBy(parsedBody, isEmpty);
fetchUri = uri + "?" + queryString.stringify(command);
}
return fetch(fetchUri, newOptions);
};
const link = createHttpLink({
uri: graphQLUrl,
fetchOptions: { method: "GET" },
fetch: customFetch
});
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ createHttpLink
рдмрдЬрд╛рдп useGETForQueries
рдЕрдВрджрд░ fetchOptions
рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рд╢реЙрдЯ рджреЗрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@szdc @Outlaw11A @arackaf рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ: