Je peux atteindre ce noeud final, http://catfacts-api.appspot.com/api/facts?number=99
via Postman et il renvoie JSON
De plus, j'utilise create-react-app et voudrais éviter de configurer une configuration de serveur.
Dans mon code client, j'essaie d'utiliser fetch
pour faire la même chose, mais j'obtiens l'erreur suivante:
Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur le .__ demandé. Ressource. Origin ' http: // localhost: 3000 ' n'est donc pas autorisé accès. Si une réponse opaque répond à vos besoins, définissez le .__ de la demande. mode to 'no-cors' pour récupérer la ressource avec CORS désactivé.
J'essaie donc de transmettre un objet, à mon Fetch, qui désactivera CORS, comme ceci:
fetch('http://catfacts-api.appspot.com/api/facts?number=99', { mode: 'no-cors'})
.then(blob => blob.json())
.then(data => {
console.table(data);
return data;
})
.catch(e => {
console.log(e);
return e;
});
Curieusement, l’erreur que j’obtiens est en fait une erreur de syntaxe avec cette fonction. Je ne suis pas sûr que ma fetch
réelle soit cassée, car lorsque je supprime l'objet {mode: 'no-cors'} et que je le fournis avec une URL différente, il fonctionne parfaitement.
J'ai également essayé de transmettre l'objet { mode: 'opaque'}
, mais cela renvoie l'erreur d'origine ci-dessus.
Je crois que tout ce que j'ai à faire est de désactiver CORS. Qu'est-ce qui me manque?
La solution très simple (2 min pour configurer) consiste à utiliser local-ssl-proxy package de npm
L'usage est simple:
1. Installez le paquet: npm install -g local-ssl-proxy
2. Pendant que vous exécutez votre local-server
, masquez-le avec le local-ssl-proxy --source 9001 --target 9000
P.S: Remplacez --target 9000
par le -- "number of your port"
et --source 9001
par --source "number of your port +1"
La solution simple: Ajoutez ce qui suit au sommet du fichier php à partir duquel vous demandez les données.
header("Access-Control-Allow-Origin: *");
Donc, si vous êtes comme moi et que vous développez un site Web sur localhost où vous essayez d'extraire des données de Laravel API et de les utiliser dans votre Vue front-end, et que vous voyez ceci problème, voici comment je l'ai résolu:
php artisan make:middleware Cors
. Cela créera app/Http/Middleware/Cors.php
pour vous.Ajoutez le code suivant dans la fonction handles
dans Cors.php
:
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
Dans app/Http/kernel.php
, ajoutez l'entrée suivante dans le tableau $routeMiddleware
:
‘cors’ => \App\Http\Middleware\Cors::class
(Il y aurait d'autres entrées dans le tableau comme auth
, guest
etc. Assurez-vous aussi que vous faites cela dans app/Http/kernel.php
car il y a un autre kernel.php
dans Laravel)
Ajoutez ce middleware lors de l'enregistrement de route pour toutes les routes où vous souhaitez autoriser l'accès, comme ceci:
Route::group(['middleware' => 'cors'], function () {
Route::get('getData', 'v1\MyController@getData');
Route::get('getData2', 'v1\MyController@getData2');
});
mounted()
et non dans data()
. Assurez-vous également que vous utilisez http://
ou https://
avec l'URL de votre appel fetch()
.Crédits complets à Pete Houston article de blog .
La solution pour moi était juste de le faire côté serveur
J'ai utilisé la bibliothèque C # WebClient
pour récupérer les données (dans mon cas, il s'agissait de données image) et les renvoyer au client. Il y a probablement quelque chose de très similaire dans votre langage côté serveur choisi.
//Server side, api controller
[Route("api/ItemImage/GetItemImageFromURL")]
public IActionResult GetItemImageFromURL([FromQuery] string url)
{
ItemImage image = new ItemImage();
using(WebClient client = new WebClient()){
image.Bytes = client.DownloadData(url);
return Ok(image);
}
}
Vous pouvez le modifier en fonction de votre cas d'utilisation. Le point principal est que client.DownloadData()
a fonctionné sans erreur CORS. En règle générale, les problèmes CORS ne concernent que des sites Web. Il est donc judicieux de faire des requêtes "intersites" à partir de votre serveur.
Ensuite, l'appel d'extraction de React est aussi simple que:
//React component
fetch(`api/ItemImage/GetItemImageFromURL?url=${imageURL}`, {
method: 'GET',
})
.then(resp => resp.json() as Promise<ItemImage>)
.then(imgResponse => {
// Do more stuff....
)}