我正在构建一个简单的HTTP服务器,并且在处理POST请求时遇到一些问题。以下是创建它的方法:
def make_post_request
puts "Enter the name: "
name = gets.chomp
puts "Enter the email: "
email = gets.chomp
data = { person: { name: name, email: email } }
puts data.to_json
request = "POST /thanks.html HTTP/1.0\nContent-Length: #{data.to_s.length}\r\n\r\n#{data.to_json}"
return request
end
这是服务器代码(未完整):
request = ""
while line = client.gets
request << line.chomp
end
问题是服务器没有收到&#34; \ r \ n \ r \ n \ n&#34;之后的部分,我的代码出了什么问题?
答案 0 :(得分:1)
从您的代码中确切地知道您正在做什么,但我怀疑您的问题是您依赖于gets
,它将尝试从IO对象返回一个完整的行。这意味着它将继续阻塞等待套接字中的换行符(或者它被关闭)。
由于您的数据不以换行符结束,并且客户端可能正在等待响应(因此不会关闭连接),服务器正在等待从未到来的换行符。
您可以在请求的末尾添加\n
,这可能会使您的代码在此工作,但通常使用正文解析HTTP消息比这更棘手。基本方法是解析标题并提取内容长度,然后您可以从正文中读取那么多字节,并且您将知道已到达消息的末尾。当然,如果你开始考虑像分块传输编码这样的事情,这会变得更加复杂。