Читать междоменный ответ JSON - PullRequest
8 голосов
/ 16 марта 2011
     <script>
        $.ajaxSetup( {contentType: 'application/json'} );
        function submit_data(f){
          alert('submitting')
          var data_string = $(f).serialize();
          $.ajax({
                url: "http://localhost:3000/application/1/contact_us.json?jsonpcallback=?"+data_string,
                dataType: "jsonp",
                type : 'post',
                processData: false,
                crossDomain: true,
                contentType: "application/json",
                jsonp: false,
                jsonpcallback: result()
            });
        }

        function result(){
          alert('back in')
          alert(data)
        }
        function jsonp1300279694167(){
          alert('dhoom')
        }
      </script>

У меня есть скрипт выше для запросов по домену и размещения данных в форме.
Кажется, все работает нормально.Ответ JSON можно увидеть в консоли Firebug.Я хочу обработать ответ и отобразить сообщения о состоянии соответственно пользователю.Как мне этого добиться?


ОБНОВЛЕНИЕ

Я пытался, как подсказал TJ Crowder , но пока не получилось.Модифицированный код, как показано ниже

function submit_data(f){
  alert('submitting')
  var data_string = $(f).serialize();
  $.ajax({
            url: "http://localhost:3000/application/1/contact_us.json?"+data_string,
            dataType: "jsonp",
            crossDomain: true,
            success: handleSuccess()
        });
}



function handleSuccess(data) {
  alert("Call completed successfully");
  alert(data);
}

Это не вызывает data и оповещения undefined.Если я пытаюсь передать его из success: handleSuccess(), он выдает ошибки и перенаправляет запрос http.

Я получаю ответ от приложения Ruby on Rails.Вот метод, который я использую

def create
    errors = ContactUsForm.validate_fields(params)
    logger.info errors.inspect
    if errors.blank?
      respond_to do |format|
        format.json {render :json => {:status => 'success'}.to_json}
      end
    else
      respond_to do |format|
        format.json {render :json => {:status => 'failure', :errors => errors}.to_json}
      end
    end
  end

Есть ли что-то, что мне нужно настроить в моем приложении rails

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Ты рядом. Вы просто используете обратный вызов success как обычно (см. ajax документы), а не специальный:

$.ajax({
    url: "http://localhost:3000/application/1/contact_us.json?jsonpcallback=?"+data_string,
    dataType: "jsonp",
    type : 'post',
    processData: false,
    crossDomain: true,
    contentType: "application/json",
    jsonp: false,
    success: function(data) {
        // Use data here
    }
});

Также ваш код:

jsonpresponse: result()

... будет вызывать функцию result и затем использовать ее возвращаемое значение для свойства jsonpresponse вызова ajax. Если вы хотите использовать отдельную функцию, это нормально, но вы не включаете (), поэтому:

$.ajax({
    url: "http://localhost:3000/application/1/contact_us.json?jsonpcallback=?"+data_string,
    dataType: "jsonp",
    type : 'post',
    processData: false,
    crossDomain: true,
    contentType: "application/json",
    jsonp: false,
    success: result
});

function result(data) {
    // use `data` here
}

Кроме того, я почти уверен, что вам не нужен / не нужен параметр jsonp, если вы используете success, поэтому:

$.ajax({
    url: "http://localhost:3000/application/1/contact_us.json?jsonpcallback=?"+data_string,
    dataType: "jsonp",
    type : 'post',
    processData: false,
    crossDomain: true,
    contentType: "application/json",
    success: result
});

function result(data) {
    // use `data` here
}

Наконец: Вы уверены, хотите установить contentType? Это относится к контенту, который отправляется на сервер, а не к контенту, полученному с него. Если вы действительно отправляете данные в формате JSON на сервер, отлично, все в порядке; но похоже, что вы используете функцию jQuery serialize, которая не будет генерировать JSON (она создает строку данных в кодировке URL). Поэтому вы, вероятно, хотите удалить contentType как из вызова, так и из вызова ajaxSetup.

1 голос
/ 17 марта 2011

Я надеюсь, что вы можете попробовать jQuery-JSONP
jQuery-JSONP How To

[Пример]

$.getJSON('server-url/Handler.ashx/?Callback=DocumentReadStatus',
  {
      userID: vuserID,
      documentID: vdocumentID
  },
  function(result) {
      if (result.readStatus == '1') {
          alert("ACCEPTED");
      }
      else if (result.readStatus == '0') {
          alert("NOT ACCEPTED");
      }
      else {
          alert(result.readStatus);
      }
  });
0 голосов
/ 22 марта 2011

Я перепробовал много уроков, включая ответы выше, но безуспешно.Итак, я реализовал это как показано нижев create.js.erb

<% if @errors.blank? %>
  window.location = "<%= @application.redirect_url  %>"
<% else %>
  var errors = replaceAll('<%= escape_javascript(@errors.to_json)%>', "&quot;", "'")
  var errors_json = eval('(' + errors + ')')
  show_errors(errors_json);
  function replaceAll(txt, replace, with_this) {
    return txt.replace(new RegExp(replace, 'g'),with_this);
  }
<% end %>

Таким образом, я вызвал submit_form при отправке формы и вызвал show_errors функцию javascript с самого сервера.И это работает .. Но все же я хотел бы получить комментарии, если это худшее решение?

...