#ruby #http #tcp
#ruby #http #tcp
Вопрос:
Я написал класс в Ruby
, который действует как HTTP-клиент. Код минимален, но причина, по которой я не использую 'net/http'
, заключается в том, что этот метод позволяет мне иметь больший контроль над выполняемыми запросами, а документация по HTTP вообще не помогает.
В любом случае, проблема в том, что сокет будет работать только для одного запроса и ответа. Отправка второго или последующего запроса дает мне пустой ответ.
Например:
- Открыть соединение с Google
- ПОЛУЧАЕМ «/»
- Ответ — это google.ca html
- ПОЛУЧАЕМ «/»
- Ответ пустой
Я пытался закрывать и открывать соединение между запросами, но это только замедлило его и не устранило проблему. Я все еще получаю пустые ответы.
Итак, в чем здесь проблема?
Есть ли метод, который позволяет мне проверить, имеет ли TCPSocket
объект открытое соединение, чтобы я случайно не открыл новое?
Комментарии:
1. Без примеров кода действительно сложно быть конкретным. Вместо того, чтобы изобретать хорошо продуманное колесо, почему бы не взглянуть на Ruby’s
open-uri
или typhoeus, httpclient или curb gems?
Ответ №1:
Попробуйте:
require "socket"
host = "google.com"
port = 80
socket = TCPSocket.new host,port
request = "GET / HTTP/1.0rnHost:#{host}rnrn"
socket.print request
response = socket.read
Это вернет главную страницу Google. Если вы хотите отправлять запрос за запросом, измените его на «HTTP / 1.1» и прочитайте ответ, затем отправьте следующий запрос.