Pour le moment, dans mon application React-Native, j'ai les éléments suivants:
fetch('http://localhost/SOMETHING', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer '+this.state.authtoken
}
})
Objectif: faire savoir à mon API quel UID effectue l'appel. Je sais que cela devrait être en authtoken, mais différents utilisateurs peuvent avoir le même authtoken.
Ma première pensée est d'ajouter un ? Uid = $ {UID} à la fin de chaque URL . Cependant, j'ai GET, POST, PATCHs, avec leur propre ensemble de requêtes
Une autre pensée serait d'ajouter une valeur d'en-tête avec les données UID.
Indépendamment de ce que je choisis, cela ce serait génial de pouvoir ajouter cette valeur à chaque FETCH sans avoir à faire beaucoup de travail.
Est-ce quelque chose qui est possible? Ouvert aux suggestions sur ce que vous feriez.
3 Réponses :
Si vous le pouvez, le mieux serait de passer à Axios ( https://github.com/axios/axios ) - c'est beaucoup plus facile de le faire là-bas.
Mais si vous devez utiliser fetch, https://github.com/werk85/fetch-intercept est votre solution.
Exemple de code
fetchIntercept.register({
request: (url, config) => {
config.headers = {
"X-Custom-Header": true,
...config.headers
};
return [url, config];
}
});
Je ne sais pas si vous êtes prêt à abandonner fetch , mais nous utilisons apisauce .
import { fetch } from '../api';
fetch('http://localhost/SOMETHING');
modifier
Si vous souhaitez le conserver à proximité de fetch , vous pourrait créer une fonction d'assistance.
import { setAuthToken } from '../api';
// e.g. after login
setAuthToken('token');
Vous n'utiliserez probablement la fonction setAuthToken qu'une seule fois.
let authToken = null;
export const setAuthToken = token => {
authToken = token;
};
export const fetch = (url, options) => {
if (!options) {
options = {};
}
if (!options.headers) {
options.headers = {};
}
if (authToken) {
options.headers['Authorization'] = `Bearer ${authToken}`;
}
return fetch(url, options);
};
Ensuite, là où vous utiliseriez normalement fetch:
import { create } from 'apisauce';
const api = create({
baseURL: 'http://localhost',
headers: { 'Accept': 'application/json' },
});
api.addRequestTransform(request => {
if (accessToken) {
request.headers['Authorization'] = `bearer ${accessToken}`;
}
});
api.get('/SOMETHING');
Je n'envisagerais pas de créer une fonction d'assistance unique et une instruction d'importation supplémentaire pour chaque extraction beaucoup de "travail supplémentaire".
Vous pouvez créer une fonction wrapper pour la récupération avec l'uid
const fetchOptions = {
method: 'POST',
body: {
hello: 'world',
},
};
fetchWithUid('http://localhost/SOMETHING', 123, 'abcd', fetchOptions);
Utilisez la fonction fetchWithUid comme ceci, les options fetchOptions imitent simplement l'option de la fonction de récupération d'origine. p>
function fetchWithUid(baseUrl, uid, authtoken, options) {
const { method, headers, body, ...rest } = options;
const fetchOptions = {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + authtoken,
...headers,
},
method,
...rest,
};
if (body) {
fetchOptions.body = JSON.stringify(body);
}
return fetch(`${baseUrl}?uid=${uid}`, fetchOptions);
}
Pouvez-vous simplement créer une méthode d'aide qui l'ajoute? Au lieu d'appeler fetch directement, vous appelez votre méthode qui effectue l'appel fetch?
Quel est le problème avec l'ajout d'un autre en-tête appelé UID?
@bhspencer Il n'y a rien de mal à cela. Essayer simplement de trouver la solution la plus efficace
+1 pour les méthodes d'aide de @ epascarello. Notre base de code a un fichier d'extraction avec fetchJSON (gère l'analyse de la réponse), fetchWithAuth (ajoute l'en-tête Bearer), postJSON (method = 'POST'), putJSON (method = 'PUT'). C'est également un endroit utile pour valider la réponse et prétraiter les erreurs.