Ustawianie ciągu zapytania za pomocą żądania fetch GET
Próbuję użyć nowego API Fetch :
Składam GET
taką prośbę:
var request = new Request({
url: 'http://myapi.com/orders',
method: 'GET'
});
fetch(request);
Nie jestem jednak pewien, jak dodać ciąg zapytania do zapytania GET
. Najlepiej, aby móc złożyć GET
wniosek do URL
Jak:
'http://myapi.com/orders?order_id=1'
W jQuery
mógłbym to zrobić, przekazując {order_id: 1}
jako parametr data
z $.ajax()
. Czy istnieje równoważny sposób, aby to zrobić z nowym Fetch API
?
12 answers
Aktualizacja Marzec 2017:
URL.wsparcie searchParams oficjalnie wylądowało w Chrome 51, ale inne przeglądarki nadal wymagają polyfill .
oficjalnym sposobem pracy z parametrami zapytań jest dodanie ich do adresu URL. Z spec , Oto przykład:
var url = new URL("https://geo.example.org/api"),
params = {lat:35.696233, long:139.570431}
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]))
fetch(url).then(/* … */)
Jednak nie jestem pewien, czy Chrome obsługuje właściwość searchParams
adresu URL (w momencie pisania), więc możesz chcieć użyć strony trzeciej library lub roll-your-own solution.
Aktualizacja Kwiecień 2018:
Za pomocą konstruktora urlsearchparams możesz przypisać tablicę 2D lub obiekt i po prostu przypisać ją do url.search
zamiast zapętlać wszystkie klucze i dołączyć je
var url = new URL('https://sl.se')
var params = {lat:35.696233, long:139.570431} // or:
var params = [['lat', '35.696233'], ['long', '139.570431']]
url.search = new URLSearchParams(params).toString();
fetch(url)
Sidenote: URLSearchParams
jest również dostępny w NodeJS
const { URL, URLSearchParams } = require('url');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-21 08:46:55
Zwięzłe podejście ES6:
fetch('https://example.com?' + new URLSearchParams({
foo: 'value',
bar: 2,
}))
Funkcja URLSearchParams toString() przekonwertuje zapytanie args do ciągu znaków, który może być dołączony do adresu URL. W tym przykładzie metoda ToString () jest wywoływana domyślnie, gdy zostanie połączona z adresem URL. Prawdopodobnie będziesz chciał jawnie wywołać ToString (), aby poprawić czytelność.
IE nie obsługuje URLSearchParams (lub fetch), ale istnieją polyfills dostępne .
Jeśli używasz node, możesz dodać fetch API poprzez pakiet node-fetch . URLSearchParams jest dostarczany z węzłem i można go znaleźć jako obiekt globalny od wersji 10. W starszej wersji można ją znaleźć pod adresem require('url').URLSearchParams
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-10 20:27:39
let params = {
"param1": "value1",
"param2": "value2"
};
let query = Object.keys(params)
.map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
.join('&');
let url = 'https://example.com/search?' + query;
fetch(url)
.then(data => data.text())
.then((text) => {
console.log('request succeeded with JSON response', text)
}).catch(function (error) {
console.log('request failed', error)
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-30 13:29:40
Jak już odpowiedziałem, jest to na spec nie możliwe z fetch
- API, jeszcze. Ale muszę zauważyć:
Jeśli jesteś na node
, jest querystring
Pakiet. Może on stringify / parse objects/querystrings:
var querystring = require('querystring')
var data = { key: 'value' }
querystring.stringify(data) // => 'key=value'
...następnie po prostu dołącz go do adresu url, aby zażądać.
Problem z powyższym polega jednak na tym, że zawsze trzeba przedłożyć znak zapytania (?
). Innym sposobem jest użycie metody parse
z pakietu nodes url
i zrobienie tego jako następuje:
var url = require('url')
var data = { key: 'value' }
url.format({ query: data }) // => '?key=value'
Zobacz query
w https://nodejs.org/api/url.html#url_url_format_urlobj
Jest to możliwe, ponieważ robi to wewnętrznie tylko to :
search = obj.search || (
obj.query && ('?' + (
typeof(obj.query) === 'object' ?
querystring.stringify(obj.query) :
String(obj.query)
))
) || ''
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 20:31:45
Możesz użyć #stringify
z ciągu zapytania
import { stringify } from 'query-string';
fetch(`https://example.org?${stringify(params)}`)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 13:46:25
EncodeQueryString-kodowanie obiektu jako parametrów querystring
/**
* Encode an object as url query string parameters
* - includes the leading "?" prefix
* - example input — {key: "value", alpha: "beta"}
* - example output — output "?key=value&alpha=beta"
* - returns empty string when given an empty object
*/
function encodeQueryString(params) {
const keys = Object.keys(params)
return keys.length
? "?" + keys
.map(key => encodeURIComponent(key)
+ "=" + encodeURIComponent(params[key]))
.join("&")
: ""
}
encodeQueryString({key: "value", alpha: "beta"})
//> "?key=value&alpha=beta"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 21:32:43
Może tak będzie lepiej:
const withQuery = require('with-query');
fetch(withQuery('https://api.github.com/search/repositories', {
q: 'query',
sort: 'stars',
order: 'asc',
}))
.then(res => res.json())
.then((json) => {
console.info(json);
})
.catch((err) => {
console.error(err);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 08:24:14
Wiem, że jest to absolutna oczywistość, ale uważam, że warto dodać to jako odpowiedź, ponieważ jest najprostsza ze wszystkich:
const orderId = 1;
fetch('http://myapi.com/orders?order_id=' + orderId);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-07 20:48:18
Rozwiązanie bez zewnętrznych pakietów
Aby wykonać polecenie GET używając API fetch pracowałem nad tym rozwiązaniem, które nie wymaga instalacji pakietów.
Jest to przykład wywołania API map Google.]}// encode to scape spaces
const esc = encodeURIComponent;
const url = 'https://maps.googleapis.com/maps/api/geocode/json?';
const params = {
key: "asdkfñlaskdGE",
address: "evergreen avenue",
city: "New York"
};
// this line takes the params object and builds the query string
const query = Object.keys(params).map(k => `${esc(k)}=${esc(params[k])}`).join('&')
const res = await fetch(url+query);
const googleResponse = await res.json()
Skopiuj ten kod i wklej go na konsolę, aby zobaczyć, jak to działa!!
Wygenerowany adres url to coś w stylu:
https://maps.googleapis.com/maps/api/geocode/json?key=asdkf%C3%B1laskdGE&address=evergreen%20avenue&city=New%20York
To właśnie szukałem zanim postanowiłem to napisać, enjoy: D
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-24 02:46:04
Literały szablonów są również ważną opcją tutaj i zapewniają kilka korzyści.
Możesz zawierać surowe ciągi znaków, liczby, wartości logiczne itp.:
let request = new Request(`https://example.com/?name=${'Patrick'}&number=${1}`);
Możesz dołączyć zmienne:
let request = new Request(`https://example.com/?name=${nameParam}`);
Możesz dołączyć logikę i funkcje:
let request = new Request(`https://example.com/?name=${nameParam !== undefined ? nameParam : getDefaultName() }`);
Jeśli chodzi o strukturyzację danych większego ciągu zapytania, lubię używać tablicy połączonej z łańcuchem. Uważam, że jest to łatwiejsze do zrozumienia niż niektóre z innych metod:
let queryString = [
`param1=${getParam(1)}`,
`param2=${getParam(2)}`,
`param3=${getParam(3)}`,
].join('&');
let request = new Request(`https://example.com/?${queryString}`, {
method: 'GET'
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 20:07:50
Pracowałem właśnie z Fetchmodule Nativescript i wymyśliłem własne rozwiązanie używając manipulacji łańcuchami. Dołącza ciąg zapytania bit po bitu do adresu url. Oto przykład, w którym zapytanie jest przekazywane jako obiekt json (query = {order_id: 1}):
function performGetHttpRequest(fetchLink='http://myapi.com/orders', query=null) {
if(query) {
fetchLink += '?';
let count = 0;
const queryLength = Object.keys(query).length;
for(let key in query) {
fetchLink += key+'='+query[key];
fetchLink += (count < queryLength) ? '&' : '';
count++;
}
}
// link becomes: 'http://myapi.com/orders?order_id=1'
// Then, use fetch as in MDN and simply pass this fetchLink as the url.
}
Przetestowałem to na wielu parametrach zapytania i działało jak urok :) Mam nadzieję, że to komuś pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-10 22:34:37
Var paramsdate=01+ '%s' + 12+'%s'+2012 + '%s';
Request. get (" https://www.exampleurl.com?fromDate=" + paramsDate;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-31 12:29:42