使用Net::HTTP进行API调用时抛出Net::HTTPBadResponse错误

5

我正在使用Rails环境。 我正在使用Net :: HTTP模块调用外部API并获取响应。 在我的本地主机上,这运行良好。 但是在暂存环境中,它会抛出一个Net :: HTTPBadResponse错误。 我的临时环境启用了SSL,这就是区别所在。 下面提供代码片段和错误信息。

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<!DOCTYPE...的内容,而不是仅仅是<!DOCTYPE...。请检查您的服务器设置。 - Steffen Ullrich
嗨,我没有完全理解你的意思。你能再详细解释一下吗? - apr
一个HTTP消息由头部和正文组成,头部的第一行是状态行,它看起来像“HTTP/1.1 200 ok”等。Net::HTTP抱怨无效的状态行,因为它看起来像你的服务器只发送了HTTP正文,没有HTTP头部。所以你的服务器可能有问题。 - Steffen Ullrich
谢谢您的时间。我的问题已经解决了。我将我的解决方案作为下面的答案给出。 - apr
1个回答

2
问题在于从启用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表单中发布大量数据(> 1 lakh字符)时才会出现此错误。您能告诉我服务器端需要进行哪些配置吗?我也在这里发布了我的查询:(http://stackoverflow.com/questions/27146412/nethttpbadresponse-wrong-status-line-html-when-posting-huge-form-data)。如果您也能回答那个问题,那就太好了。谢谢。 - furiabhavesh
你好,据我所知,POST 没有大小限制。因为我们是将数据作为参数列表发送,而不是作为 URL。正如你在问题中提到的,你正在使用外部 API,请检查 API 描述字段是否有任何字符限制。 - apr
这个领域没有限制。我们很快就能够访问暂存服务器日志。现在,至少可以确定这是一个服务器端问题,因为客户端没有任何错误。感谢您的回复。 - furiabhavesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接