2 Stimmen

Rails JSON API - Domänenproblem?

Ich habe Ryan Bates #348 Video zur Erstellung einer JSON API mit dem rails-api gem fertiggestellt. Ich habe es funktioniert wie im Beispiel. Allerdings hat er in seinem Beispiel die Seite, die die API in demselben Projekt aufruft. Mein Ziel ist es, die Client-App von der API-App zu trennen.

Ich habe eine zweite Rails-App erstellt, die einfach die Seite enthält, die eine JSON-Anforderung für die API-Daten und einen Beitrag beim Absenden des Formulars ausführt. Ich habe die Client-App auf localhost:3000 und die API auf localhost:4000 laufen.

Nachfolgend finden Sie den clientseitigen Code. Er sendet erfolgreich einen neuen Geschäftsdatensatz, aber der GET lädt nicht die Liste der Geschäfte. Ein Blick in die Protokolle zeigt, dass die Seite als HTML angefordert wird. Als die Seite Teil desselben API-Projekts war, hat derselbe Code den Aufruf als JSON in den Protokollen vorgenommen.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
  $(function() {
    function addDeal(deal) {
      $('#deals').append('<li>' + deal.name + '</ul>');
    }

    $('#new_deal').submit(function(e) {
      $.post('http://localhost:4000/deals', $(this).serialize(), addDeal);
      this.reset();
      e.preventDefault();
    });

    $.getJSON('http://localhost:4000/deals', function(deals) {
      $.each(deals, function() { addDeal(this); });
    });
  });
</script>

<div id="container">
  <h1>My Deals</h1>
  <form id="new_deal">
    <input type="text" name="deal[name]" id="deal_name">
    <input type="submit" value="Add">
  </form>
  <ul id="deals"></ul>
</div>

2voto

Milan Jaric Punkte 5426

Aufgrund der Cross Origin Policy haben Sie folgende Möglichkeiten:

  1. Verwenden Sie jsonp (tun Sie dies nicht, da Sie Ihren Server haben :) siehe unten)
  2. Cross Origin Resource Sharing auf dem Server verwalten, habe ich kürzlich eine Antwort geschrieben aquí wie man dies erreicht
  3. Sie könnten Schienen verwenden ActiveResource::Base um mit Ihrer API zu verbinden, aber es kann langsam sein, und Sie würden sich wiederholen, es sei denn, es gibt einige Präsentation Logik, die Sie auf Backend benötigen. Übrigens, prüfen Sie Nibbler gem kann es etwas besser sein... es hängt wirklich davon ab, was Sie im Backend tun müssen.

Wie auch immer. Ich würde vermeiden, Ansatz 1, seine Art von Overhead vor allem, wenn Sie POST, PUT oder DELETE möchten, und Sie können Option 2 verwenden, wenn Sie reine Javascript-App als UI ausgeführt haben. Aber auch wenn Sie bauen JS agnostic app Sie immer brauchen ein bisschen Backend Verarbeitung so Option 3 ist wahrscheinlich etwas, das Sie bevorzugen würden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X