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?

Author: Arsen Khachaturyan, 2016-01-27

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');
 219
Author: CodingIntrigue,
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.

 94
Author: Scotty Jamison,
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)
  });
 37
Author: Sudharshan,
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)
    ))
) || ''
 28
Author: yckart,
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ć #stringifyz ciągu zapytania

import { stringify } from 'query-string';

fetch(`https://example.org?${stringify(params)}`)
 10
Author: Hirurg103,
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"
 7
Author: ChaseMoskal,
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);
});
 5
Author: Bin HOU,
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);
 4
Author: Evert,
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

 3
Author: Carlos,
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'
});
 2
Author: Pat Kearns,
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.

 0
Author: Amjad Abujamous,
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;

 -5
Author: Kirubakaran R,
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