<p>apollo-link-http๋Š” GET ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2017๋…„ 11์›” 12์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link

๋ฌธ์„œ ์— ๋”ฐ๋ฅด๋ฉด fetchOptions ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ ๋ฐฉ๋ฒ•์„ GET ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•œ ํ›„์— ์ฟผ๋ฆฌ๊ฐ€ ์š”์ฒญ ๋ณธ๋ฌธ์ด ์•„๋‹Œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํฌํ•จ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์œผ๋กœ GET ์š”์ฒญ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด Chrome์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜๋„ํ•œ ๊ฒฐ๊ณผ:
์š”์ฒญ ๋ฐฉ๋ฒ•์ด GET์ธ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒฐ๊ณผ:
์š”์ฒญ ๋ณธ๋ฌธ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•:

client.query({
  context: {
    fetchOptions: {
      method: 'GET',
    },
  },
  query: QUERY,
  variables: { query },
})
enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@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
});

๋ชจ๋“  20 ๋Œ“๊ธ€

@szdc ๋„ค, ํ™•์‹คํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/apollographql/apollo-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์— ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์‹ ์˜ ๊ฒƒ์„ ๋กค๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฝค ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Object.keys๋ฅผ ๋งคํ•‘ํ•˜์‹ญ์‹œ์˜ค.

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

https://github.com/Cyberlane/object-to-querystring

@jbaxleyiii ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๋†€๋ž๋‹ค!

๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด:

http://localhost/graphql?operationName=AllPlayersQuery&variables=%5Bobject%20Object%5D&query=query%20All...

๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” variables=%5Bobject%20Object%5D ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ํ‘œ์ค€ URI ์ง๋ ฌํ™”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์™œ ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ์š”?

ํ‘œ์ค€ URI? ์ด๊ฒƒ์€: %5Bobject%20Object%5D ?

encodeURIComponent('books(title:"Hello World"){๋„์„œ{title}}')

books(title%3A%22Hello%20World%22)%7BBook%7Btitle%7D%7D

Apollo์—์„œ ๋‚ด ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

query AllPlayers {
  players {
    id
    name
    surname
}

๊ทธ๋ž˜์„œ @jbaxleyiii๊ฐ€ ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ [Object object] ๋ณ€์ˆ˜๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ GET์„ ํ†ตํ•ด ๊ฐ€์ ธ์™€ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐ˜์‘ ์•ฑ(create-react-app์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ)์ž…๋‹ˆ๋‹ค. index.js ์ฐธ์กฐ :

@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 ๋•Œ ๋งž์ถค ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋‚ด์žฅ๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ฟผ๋ฆฌ์™€ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๊นŒ? ์ฟผ๋ฆฌ(DNS ์บ์‹œ์šฉ)์—๋งŒ GET์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/apollographql/apollo-link/pull/510 ์—์„œ ์ˆ˜์ •๋œ ํ›„ ์•ฝ๊ฐ„ ์ถ”๊ฐ€๋œ useGETForQueries ์ด์ „์˜ ์˜ค๋ž˜๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์Œ, useGETForQueries๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์ด ์ค„์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/apollographql/apollo-link/blob/f94b1c6b984619ec1ef68cca3224be788ea140e4/packages/apollo-link-http/src/httpLink.ts#L41

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
});

๋‹น์‹ ์ด ํ†ต๊ณผ๋œ๋‹ค๋ฉด ๋‚˜๋Š” ๋‚˜์˜ ์งˆ๋ฌธ์€ ์ƒ๊ฐ useGETForQueries ๋‚ด๋ถ€ fetchOptions ๋Œ€์‹  ์ง์ ‘ ๋‚ด๋ถ€์˜ createHttpLink , ๊ทธ ๋‹น์‹ ์ด ๊ด€์ฐฐ ํ•  ํ–‰๋™,ํ•˜์ง€๋งŒ ๊ฒƒ ๋˜ํ•œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค API ์ž‘๋™ ๋ฐฉ์‹. ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ•ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰