<p>apollo-link-http tidak menghargai penggantian metode GET</p>

Dibuat pada 12 Nov 2017  ·  20Komentar  ·  Sumber: apollographql/apollo-link

Sesuai dengan dokumen , opsi fetchOptions memungkinkan kita untuk mengatur metode permintaan ke GET . Saya berharap setelah melakukannya, kueri akan dimasukkan sebagai parameter string kueri daripada badan permintaan; Chrome membuat kesalahan jika Anda mencoba membuat permintaan GET dengan badan.

Hasil yang diinginkan:
String kueri harus dibuat jika metode permintaan adalah GET.

Hasil sebenarnya:
Badan permintaan digunakan.

Cara mereproduksi masalah:

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

Komentar yang paling membantu

@szdc @Outlaw11A @arackaf di sini adalah bagaimana melakukannya:

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

Semua 20 komentar

@szdc ya ini pasti tidak berhasil! Apakah Anda bersedia menambahkannya? Sesuatu seperti https://github.com/apollographql/apollo-link/issues/257 mungkin merupakan solusi yang baik juga untuk mengubah permintaan sebelum dikirim?

cc @arackaf @outlaw11a @puttyman yang semua tertarik dengan ini! Seharusnya perubahan yang cukup kecil untuk ditambahkan!

Saya akan menambahkannya jika tidak ada orang lain yang mau.

@szdc @arackaf jadi ternyata ini sudah mungkin! Saya akan mendorong tes dan dokumen segera menunjukkan bagaimana hal itu dapat dilakukan tanpa perubahan internal

@szdc @Outlaw11A @arackaf di sini adalah bagaimana melakukannya:

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 itu terlihat luar biasa! Hanya ingin tahu dari mana objectToQuery datang? Apakah ada util pada npm untuk itu? Saya membayangkan akan sangat mudah untuk menggulung sendiri jika diperlukan - pada dasarnya memetakan Object.keys ke

escapeUriComponnt(`${k}=${obj[k]}`).join("&");

atau yang serupa

https://www.apollographql.com/docs/link/links/http.html#Sending -GET-requests-custom-fetching

@arackaf lihat komentarnya:

// turn the object into a query string, try object-to-querystring package

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

@jbaxleyiii berhasil! Ini luar biasa!

Saya hanya punya masalah.

String kueri yang dibuat:

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

berisi ini: variables=%5Bobject%20Object%5D yang merupakan masalah.

Bagaimana cara memperbaikinya?

Itu terlihat seperti serialisasi URI standar - jangan berpikir Anda bisa menghindarinya - mengapa ini menjadi masalah?

URI standar? Ini: %5Bobject%20Object%5D ?

encodeURIComponent('books(title:"Hello World"){Book{title}}')

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

Permintaan saya di Apollo adalah:

query AllPlayers {
  players {
    id
    name
    surname
}

jadi saya punya masalah dengan variabel [Object object] kosong dengan kode yang diposting oleh @jbaxleyiii.

Inilah aplikasi reaksi barebone (dibuat menggunakan create-react-app) yang diambil melalui GET dan berfungsi - lihat index.js : https://github.com/usefulio/example-graphql-via-get-react-app

@johnunclesam jelas variables tidak serial sebelum penyandian. saya cukup menyetel metode pengambilan khusus saya (diperoleh dari contoh repo) dengan menambahkan JSON.stringify bersyarat :

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

Jadi untuk apa useGETForQueries digunakan? Mengapa pengambilan khusus tidak terpasang saat useGETForQueries=true ?
Bagaimana cara membedakan kueri dan mutasi? Saya hanya ingin menggunakan GET untuk kueri (untuk cache DNS).

Ini adalah masalah lama yang mendahului useGETForQueries, yang ditambahkan sedikit setelah ini diperbaiki oleh https://github.com/apollographql/apollo-link/pull/510

umm, useGETForQueries tampaknya tidak berfungsi.

Khususnya pada baris ini sepertinya ada bug:

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;

harus seperti:

let {
    uri = '/graphql',
    // use default global fetch if nothing passed in
    fetch: fetcher,
    includeExtensions,
    fetchOptions,
    ...requestOptions
  } = linkOptions;

let {
  useGETForQueries
} = fetchOptions;

Apa yang membuatmu mengatakan itu? Bagaimana Anda menelepon createHttpLink ?

Pengamatan saya di atas adalah dari menelusuri kode dengan debugger, tetapi saya harus melakukannya lagi untuk mereproduksi.

Kode yang akhirnya kami tetapkan adalah ini:

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

Saya kira pertanyaan saya adalah, jika Anda melewati useGETForQueries di dalam fetchOptions alih-alih langsung di dalam createHttpLink , maka itu akan menjadi perilaku yang akan Anda amati, tetapi itu juga tidak akan terjadi cara kerja API. Saya sarankan mencobanya lagi!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

zsolt-dev picture zsolt-dev  ·  4Komentar

NicholasLYang picture NicholasLYang  ·  4Komentar

lobosan picture lobosan  ·  3Komentar

vjpr picture vjpr  ·  3Komentar

valerybugakov picture valerybugakov  ·  5Komentar