You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby自制Web服务器中字符串比较不匹配问题求助

问题分析与解决方案

核心问题出在words变量的类型上:

words = IO.readlines("requests.txt").last(1)

IO.readlines返回的是字符串数组,last(1)方法会返回一个包含最后一行的数组(比如["Username=test&Password=1234"]),你用它和字符串"Username=test&Password=1234"直接对比,数组与字符串永远不可能相等,因此if分支始终不会执行。

快速修复

把last(1)改成last,直接获取最后一行的字符串:

words = IO.readlines("requests.txt").last

如果坚持使用last(1),则取数组的第一个元素:

words = IO.readlines("requests.txt").last(1).first

优化建议(避免不必要的文件操作)

当前写入文件再读取的操作完全冗余,直接从req参数提取表单数据更高效,还能规避文件读写的潜在问题:

class Parser
  def parse(req, clients)
    # 从HTTP请求中提取POST表单数据(假设为POST请求)
    form_data = req.split("\r\n\r\n").last
    if form_data == "Username=test&Password=1234"
      success(clients)
    else
      # 处理不匹配的情况,避免重复发送响应
      response(clients)
    end
  end
end

额外注意事项

  1. 当前代码不管if分支是否执行,都会调用response(client),这会向客户端发送两次HTTP响应,导致浏览器解析异常。建议将response(client)移至Parser的parse方法中,用else分支处理不匹配场景。
  2. HTTP响应头需补充必要字段,比如Content-Type和Content-Length,否则浏览器可能无法正确渲染页面:
def success(succ_client)
  success_file = File.read("templates/success.html")
  headers = [
    "HTTP/1.1 200 OK",
    "Content-Type: text/html; charset=UTF-8",
    "Content-Length: #{success_file.bytesize}",
    "\r\n"
  ].join("\r\n")
  succ_client.puts(headers + success_file)
end

内容的提问来源于stack exchange,提问作者DammDamm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:01:03