J'essaie d'utiliser la nouvelle API Fetch: https://developer.mozilla.org/en/docs/Web/API/Fetch_API
Je fais une demande GET comme ceci:
var request = new Request({
url: 'http://myapi.com/orders',
method: 'GET'
});
fetch(request);
Cependant, je ne sais pas comment ajouter une chaîne de requête à la demande GET. Idéalement, je souhaite pouvoir envoyer une demande GET à une URL telle que:
'http://myapi.com/orders?order_id=1'
En jQuery, je pourrais le faire en passant {order_id: 1}
comme paramètre data
de $.ajax()
. Existe-t-il un moyen équivalent de le faire avec la nouvelle API Fetch?
Mise à jour de mars 2017:
RL.searchParams le support a officiellement atterri dans Chrome 51, mais les autres navigateurs nécessitent toujours un polyfill .
La manière officielle de travailler avec des paramètres de requête consiste simplement à les ajouter à l'URL. De la spécification , voici un exemple:
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(/* … */)
Cependant, je ne suis pas sûr que Chrome prenne en charge la propriété searchParams
d'une URL (au moment de l'écriture), vous voudrez donc peut-être utiliser une bibliothèque tierce ou solution personnalisée .
Mise à jour avril 2018:
Avec l'utilisation de constructeur URLSearchParams , vous pouvez affecter un tableau 2D ou un objet et simplement l'attribuer au url.search
au lieu de passer en boucle sur toutes les clés et de les ajouter.
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)
fetch(url)
Note: URLSearchParams
est également disponible dans NodeJS
const { URL, URLSearchParams } = require('url');
Comme déjà répondu, ceci n'est pas encore possible par spécification avec l'API fetch
-. Mais je dois noter:
Si vous êtes sur node
, il y a le paquetage querystring
. Il peut stringifier/analyser des objets/chaînes de requête:
var querystring = require('querystring')
var data = { key: 'value' }
querystring.stringify(data) // => 'key=value'
... puis ajoutez-le simplement à l'URL à demander.
Cependant, le problème avec ce qui précède est que vous devez toujours ajouter un point d'interrogation (?
). Donc, une autre façon consiste à utiliser la méthode parse
à partir du paquet node url
et procédez comme suit:
var url = require('url')
var data = { key: 'value' }
url.format({ query: data }) // => '?key=value'
Voir query
à l'adresse https://nodejs.org/api/url.html#url_url_format_urlobj
C'est possible, comme cela se fait en interne juste this :
search = obj.search || (
obj.query && ('?' + (
typeof(obj.query) === 'object' ?
querystring.stringify(obj.query) :
String(obj.query)
))
) || ''
let params = {
"param1": "value1",
"param2": "value2"
}
let query = Object.keys(params)
.map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
.join('&');
let url = 'https:example.com//xyz.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)
})
/**
* 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"
Vous pouvez utiliser #stringify
de chaîne de requête
import { stringify } from 'query-string';
fetch(`https://example.org?${stringify(params)}`)
Peut-être que c'est mieux:
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);
});
Je sais que cela énonce une évidence absolue, mais j'estime qu'il vaut la peine d'ajouter ceci à titre de réponse car c'est le plus simple de tous:
var orderId = 1;
var request = new Request({
url: 'http://myapi.com/orders?order_id=' + 1,
method: 'GET'
});
fetch(request);
Les littéraux de modèles sont également une option valide ici et offrent quelques avantages.
Vous pouvez inclure des chaînes brutes, des nombres, des valeurs booléennes, etc.:
let request = new Request(`https://example.com/?name=${'Patrick'}&number=${1}`);
Vous pouvez inclure des variables:
let request = new Request(`https://example.com/?name=${nameParam}`);
Vous pouvez inclure la logique et les fonctions:
let request = new Request(`https://example.com/?name=${nameParam !== undefined ? nameParam : getDefaultName() }`);
En ce qui concerne la structuration des données d'une chaîne de requête plus grande, j'aime bien utiliser un tableau concaténé à une chaîne. Je trouve cela plus facile à comprendre que certaines des autres méthodes:
let queryString = [
`param1=${getParam(1)}`,
`param2=${getParam(2)}`,
`param3=${getParam(3)}`,
].join('&');
let request = new Request(`https://example.com/?${queryString}`, {
method: 'GET'
});