#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:
Я думаю, это потому, что вы используете однопоточный веб-сервер. У вас есть две возможности исправить.
-
используйте passenger
-
определите, имеет ли смысл использовать net / http для локального хостинга.