http-запрос (с использованием net http или RestClient) внутри моего контроллера rails

#ruby-on-rails #ruby #ruby-on-rails-3 #rest-client #net-http

#ruby-on-rails #ruby #ruby-on-rails-3 #rest-клиент #net-http

Вопрос:

У меня проблема с созданием http-запроса внутри моего действия контроллера. Я использовал net / http и RestClient, но я не могу заставить его работать с URL-адресом моего локального сервера, т.е. http://localhost:3000/engine/do_process , я всегда получаю requesttimeout, однако он работает с другим допустимым URL.

Надеюсь, вы сможете просветить меня по этому вопросу. Я провел некоторое исследование, но не могу найти ресурсы относительно того, почему у меня возникла эта проблема с таймаутом.

Пример кода контроллера:

 require 'rest_client'

class LgController < ApplicationController
  def get_lgjson

     response =  RestClient.get("http://localhost:3000/engine/do_process_lg")
     @generated_json = response.to_str

  end
end
  

Комментарии:

1. Пожалуйста, покажите нам код для создания запроса. Я ставлю на то, что вы делаете еще один HTTP-запрос к другой части вашего приложения, и поскольку WEBrick является однопоточным сервером, он не может обслуживать его одновременно с первоначальным запросом.

2. требуется класс ‘rest_client’ LgController <ApplicationController ef get_lgjson response = RestClient.get(» localhost:3000/engine/ do_process_lg» ) @generated_json = response.to_str end конец

3. Я всегда получаю проблему с таймаутом запроса, не знаю почему.

4. Что сказал Райан Бигг: «он не может обслуживать его одновременно с первоначальным запросом». Это означает, что на RestClient#get нельзя ответить, пока ваше действие контроллера get_lgjson не завершится (т. Е. Никогда)…. Вам нужен многопоточный сервер или, возможно, запустить два экземпляра на разных портах.

5. @adzdavies спасибо за ответ. Я думаю, мне нужен многопоточный сервер. Я впервые пишу ROR, я не знаю, в какую сторону идти.

Ответ №1:

Я тоже столкнулся с этой проблемой сегодня, точно в том же контексте: использование Ruby RestClient для выполнения HTTP-запроса внутри контроллера. Ранее он работал в другом проекте с использованием OpenURI без проблем. Это было удивительно, потому что обе http-библиотеки, RestClient и OpenURI для Ruby, используют одну и ту же библиотеку Net::HTTP.

Разница заключается в URL-адресе. Мы можем установить соединение с внешним URL-адресом в контроллере, но не с localhost. Проблема, похоже, заключается в дублированном подключении к localhost. Уже открыто соединение с localhost, и мы пытаемся открыть второе. Похоже, это не работает на однопоточном веб-сервере, таком как Thin, например. Может помочь многопоточный веб-сервер, такой как Puma.

Ответ №2:

Я думаю, это потому, что вы используете однопоточный веб-сервер. У вас есть две возможности исправить.

  1. используйте passenger

  2. определите, имеет ли смысл использовать net / http для локального хостинга.