【问题标题】:API call using Net::HTTP throwing Net::HTTPBadResponse error使用 Net::HTTP 调用引发 Net::HTTPBadResponse 错误的 API
【发布时间】:2014-06-21 12:32:42
【问题描述】:

我正在使用 rails 环境。我正在使用 Net::HTTP 模块来调用外部 API 并获取响应。这在我的本地主机中运行良好。但是在暂存它时会引发 Net::HTTPBadResponse 错误。我的登台启用了 SSL。这就是区别。在下面提供代码 sn-p 和错误。

parameters = {'VirtualNumber' => '09845xxxxxx','Number[]' => "09878xxxxxx" }
x = Net::HTTP.post_form(URI.parse("https://example.com"), parameters)

Error:
Net::HTTPBadResponse (wrong status line: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">")

成功的结果将采用 XML 格式。谁能帮我解决这个问题。

谢谢你,
问候

【问题讨论】:

  • 我建议服务器在没有 HTTP 标头的情况下发回数据,例如只有身体。所以应该发送HTTP/1.1 200 ok...\r\n\r\n&lt;!DOCTYPE... 等而不是&lt;!DOCTYPE...。请查看您的服务器设置。
  • 嗨,我没有完全理解你。你能再解释一下吗?
  • 一个 HTTP 消息由一个 header 和一个 body 组成,header 的第一行是状态行,看起来像“HTTP/1.1 200 ok”等 Net::HTTP 抱怨无效状态行,因为看起来您的服务器只发送了 HTTP 正文,没有 HTTP 标头。所以你的服务器可能有问题。
  • 感谢您的宝贵时间。我的问题已经解决了。在下面给出我的解决方案。

标签: ruby-on-rails ssl net-http


【解决方案1】:

问题是从启用 ssl 的站点调用 API。因此,在调用 API 时,我们需要启用 ssl。除此之外,还需要提供基本身份验证。

parameters = {'VirtualNumber' => '09845xxxxxx','Number[]' => "09878xxxxxx" }
url = URI.parse("https://example.com")
request = Net::HTTP::Post.new(url.path)
request.basic_auth "user", "pass"
request.set_form_data(parameters)
sock = Net::HTTP.new(url.host, url.port)
if url.scheme == 'https'
  sock.use_ssl = true
end
response = sock.start {|http| http.request(request) }

【讨论】:

  • 我面临与您类似的问题,但我无权访问临时服务器。仅当我以 rails 形式发布大量数据(> 10 万个字符)时,我才会收到此错误。你能告诉我在服务器端需要做什么配置吗?我还在这里发布了我的查询:(stackoverflow.com/questions/27146412/…)。如果你也能回答这个问题就好了。谢谢。
  • 嗨,据我所知,POST 没有大小限制。因为我们将数据作为参数列表发送,而不是作为 url。正如您在问题中提到的,您使用的是外部 API,请检查您的 API 描述字段中是否有字符限制。
  • 该领域没有限制。我们将很快获得登台服务器日志的访问权限。现在,至少可以确定它是服务器端问题,因为客户端没有任何问题。感谢您的回复。
猜你喜欢
  • 2016-02-29
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2019-01-28
  • 2013-10-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多