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 },
})
@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
@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:
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!
Komentar yang paling membantu
@szdc @Outlaw11A @arackaf di sini adalah bagaimana melakukannya: