Ember.js ember-data restadapter ne parviennent pas à charger json
Cheers!
J'ai ember-data store:
TravelClient.Store = DS.Store.extend({
revision: 11,
adapter: DS.RESTAdapter.create({ bulkCommit: false, url: "http://someIP:somePORT"})
});
Et le routeur:
TravelClient.ToursRoute = Ember.Route.extend({
model: function() {
return TravelClient.Tour.find();
}
});
J'obtiens ce JSON à partir du serveur distant:
{
"tours": [
{
"id": "5110e8b5a8fefe71e0000197",
"title": "qui deserunt dolores",
"description": "Id velit nihil.",
"seats": 12,
"options": [
],
"images": [
{
"id": "5110e8b5a8fefe71e0000196",
"url": "url"
}
}
Mais quand j'essaie de return TravelClient.Tour.find()
il échoue avec:
http://someIP:somePORT/tours 404 (Not Found)
XMLHttpRequest cannot load http://someIP:somePORT/tours. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
IL semble que RESTAdapter ne sait pas, qu'il doit recevoir JSON ou quoi?
Mise à JOUR:
Dans le contrôleur de l'application sur les rails côté serveur:
def set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Request-Method'] = '*'
end
Mais c'est toujours :
OPTIONS http://someIP:somePORT/tours 404 (Not Found)
Et il semble que RESTAdapter essaie de charger des visites de ressources, pas de visites.json:
Request URL:http://someIP:somePORT/tours
SOLUTION DE TRAVAIL
Étendre RESTAdapter:
TravelClient.CUSTOMAdapter = DS.RESTAdapter.extend({
bulkCommit: false,
url: "http://remote_server_address",
buildURL: function(record, suffix) {
var s = this._super(record, suffix);
return s + ".json";
}
})
et de répondre à une demande d'OPTIONS à droite des en-têtes de
les en-têtes que vous définissez sont retournés avec la
Rack de la SCRO gem a fait le tour, merci. Je pense que c'est en faisant ce genre de choses avec des OPTIONS de demandes de "sortie de boîte".
Voici le lien pour le prochain visiteur github.com/cyu/rack-cors ftw
GET
demande, vous devez les retourner avec une OPTIONS
demandeRack de la SCRO gem a fait le tour, merci. Je pense que c'est en faisant ce genre de choses avec des OPTIONS de demandes de "sortie de boîte".
Voici le lien pour le prochain visiteur github.com/cyu/rack-cors ftw
OriginalL'auteur xamenrax | 2013-02-12
Vous devez vous connecter pour publier un commentaire.
La
RESTAdapter
attendJSON
qui n'est pas le problème mais la page et le json ne sont pas sur le même domaine, c'est un problème de sécurité. Vous pouvez résoudre ce problème en utilisant l'une des deux solutions nommé ci-dessous.Vous êtes en cours d'exécution dans le même la politique de l'origine vous devez soit utiliser
JSONP
ouCORS
. La solution la plus rapide serait probablement dire braise-les données que vous souhaitez utiliserJSONP
.Pour
CORS
votre serveur doit répondre à unOPTIONS
demande, avec les en-têtes:Access-Control-Allow-Origin
Access-Control-Request-Method
je suis pas de rails expert, mais vous aurez probablement besoin de faire quelque chose avec la gemme
rack-cors
voir ici ou ici.Vous pouvez le faire en remplaçant la
ajax
crochet dans leRESTAdapter
comme suit:Access-Control-Allow-Origin: *
de du serveur en-tête de réponse?oui, voir ici: en.wikipedia.org/wiki/Cross-origin_resource_sharing et ici: developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS Il y a quelques autres en-têtes, vous pouvez contrôler plus précisément de ce qui est autorisé.
Vérifier la mise à jour, s'il vous plaît.
Rack de la SCRO gem est juste pour plus de personnalisation spécifique - pas ce dont j'ai besoin en ce moment, mais je vous remercie pour l'attention.
Vous devez répondre à une demande d'OPTIONS avec les en-têtes en quelque sorte.
OriginalL'auteur albertjan
J'ai un simple travail autour de dans les Rails (qui fonctionne pour moi jusqu'à présent.) Il est en désordre, comme c'est, mais peut facilement être renforcé avec de la logique dans les contrôleurs.
Dans
routes.rb
:Qui retourne simplement le statut de
OK
à toutOPTIONS
demande.Puis dans
application_controller.rb
définir le Cross-origin resource sharing (SCRO) des en-têtes pour chaque demande:OriginalL'auteur Baruch
Si vous cherchez à utiliser JSONP il est beaucoup plus facile de remplacer le privé
ajaxOptions
fonction au lieu d'utiliserjQuery
et en remplaçant laajax
méthode. Braise pipe inclut la suppression de l'jQuery dépendance. Afin de faire ceci à la place:adapters/application.js
:Il serait de créer si la Braise à l'équipe de base pourrait exposer une méthode publique officiellement en charge ce (au lieu de piratage une api privée).
https://github.com/emberjs/data/blob/1.0.0-beta.15/packages/ember-data/lib/adapters/rest_adapter.js#L915
OriginalL'auteur Jamie Chong