2016-04-29 4 views
0

Я новичок в Rails и AJAX. Я хочу использовать API, который размещен на другом веб-сайте. Я столкнулся с проблемами с HTTP-запросом Cross-Orig. Поэтому я попытался сделать это, используя HTTParty.Rails - HTTPARTY-запрос через AJAX

В приведенном ниже коде я устанавливаю текст $ (". Result") как запрос JSON.parse (HTTParty()), чтобы он мог запросить веб-сайт и дать мне результат.

Rails код:

<%= form_for(@profile) do |f| %> 
    <%= f.label :content %> 
    <%= f.text_field :content, class: 'ajax-control' %> 
    <%= f.submit "Save changes", class: "btn btn-primary" %> 
<% end %> 

<p class="result"></p> 

код Javascript:

<script> 
    $(document).ready(function(){ 

    $('.ajax-control').on('keyup',function(){ 
     var charCount = $(this).val().length; 
     if(charCount===3){ 
     var str1='<%=JSON.parse(HTTParty.get("http://example.com/api.php?param='+$(this).val()+'"))%>' 
     $(".result").text(str1); 
     } 
    }); 
    }); 
</script> 

Сейчас идет странные проблемы. Вышеприведенный код отправляет запрос GET на example.com (placeholder), но получает ответ, в котором говорится, что это неверный запрос.

Однако, если я прохожу str1 следующим образом -

var str1='<%=JSON.parse(HTTParty.get("http://example.com/api.php?param=xyz"))%>' 
$(".result").text(str1); 

я получаю ожидаемый ответ. Если текстовое поле $ (". Ajax-control") является «xyz», я получаю ответ, говорящий недействительным запросом.

Содержит ли строка конкатенация в javascript новые символы, из-за которых она выдает ошибку?

ответ

1

Этот javascript (который, в свою очередь, имеет рубиновый код через erb), не будет выполнен после того, как он был впервые отображен Rails.

То есть, его не будет вызываться каждый раз, когда нажатие обратного вызова вызывается, это означает, что, когда Rails оказывает, что Javascript, очевидно, не имеет никакого знания на стороне клиента DOM, так что URL является аффективно:

JSON.parse(HTTParty.get("http://example.com/api.php?param=")) 

И удаленный сервер имеет пустое param, который он не любит ...

Если вам действительно нужно, чтобы вызвать этот API для каждого нажатия клавиши у вас есть два варианта:

  1. Получить его на работу с помощью Ajax с использованием CORS
  2. Invoke конечной точки в вашем приложении Rails, , который в свою очередь использует рубинового сторону HTTParty для вызова API и реле ответ обратно клиенту.
+0

Спасибо! Я, наконец, понимаю, почему возникла проблема. Причина, по которой я не использовал CORS, заключалась в том, что сервер, с которого хосты API не поддерживает его. Есть ли другой способ? –

+0

@ArjunBharadwaj, если вы не можете использовать CORS, тогда ваш следующий лучший вариант - использовать собственный сервер для передачи этого HTTP-запроса, поэтому сделайте запрос на ваш сервер, который вызывает запрос example.com и передает его обратно на ваш AJAX –