Java 这是有效的HTTP get请求吗?
我正在与一个向我们的应用程序发送HTTP-GET请求的系统集成。使用Jetty,花了几分钟把一些东西组装起来 我用curl测试了它(请求中有必要的转义),一切都很顺利。我按照要求得到了回复:Java 这是有效的HTTP get请求吗?,java,http,Java,Http,我正在与一个向我们的应用程序发送HTTP-GET请求的系统集成。使用Jetty,花了几分钟把一些东西组装起来 我用curl测试了它(请求中有必要的转义),一切都很顺利。我按照要求得到了回复: $ curl http://localhost:9100?field1=value1\&field2=value2\&field3=value3 计算机上的TCP转储显示通过的请求,如下所示: GET /?field1=value1&field2=value2&field3
$ curl http://localhost:9100?field1=value1\&field2=value2\&field3=value3
计算机上的TCP转储显示通过的请求,如下所示:
GET /?field1=value1&field2=value2&field3=value3 HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
Host: xxx.xxx.xxx.xxx:9100
Accept: */*
然而,生活从来没有那么简单。当我部署它以便我们能够真正开始与实际系统集成时,代码中的处理程序甚至没有被调用。Jetty立即响应“HTTP/1.1400错误请求”。TCP转储显示以下内容:
GET ?field1=value1&field2=value2&field3=value3 HTTP/1.1
就这样。。。没有标题信息,只是上面的
我现在的问题是,上述要求是否确实有效。需要斜杠吗?是否有任何标题条目是强制性的
有什么想法吗?这是否意味着我必须重新设计车轮才能使其工作
编辑:
我试着用telnet连接。对于某些Web服务器,在GET请求之后似乎确实需要/。然而,他们之间的处理方式似乎有所不同。Jetty抱怨,google运行的Web服务器抱怨。。。然而,Apache就是一个很好的例子。似乎不需要任何标题信息。我看不出有什么问题-不需要斜杠 已更正,斜杠是必需的。根据,主机:标题字段是必需的。前导斜杠不是必需的。事实证明,前导斜杠也是必需的。提供了所有杂项详细信息: 如果URL中不存在abs_路径,则必须将其指定为“/” 当用作资源的请求URI时(第5.1.2节) 客户端必须在所有HTTP/1.1请求中包含主机头字段 信息
http://localhost:9100
-斜杠-?…
?(类似于http://localhost:9100/?...
)不知道端口,但其余的看起来不错为什么每个&
之前都有一个\?编辑:嗯。的格式设置不正确。`
上面的旋度有效,\是在命令行上转义-。你确定吗?HTTP GET请求通常与您可能在浏览器地址栏中键入的内容不同。根据规范,我同意主机:字段。事实上。。。斜杠一定在那里。显然,web服务器忽略了这条规则。我可以在没有标题的情况下远程登录到一些站点并获得结果。似乎每个人都在按照自己的喜好实施标准。这取决于您是否使用HTTP1.1
或1.0
,在1.0
中,主机头是不需要的。(感谢Burhan…似乎1.0没有主机很开心:部分。)你们对此有什么建议吗?如果供应商不想解决问题,我该怎么办?Pfff,我唯一能想到的就是写某种代理。这是一个非常基本的问题-你应该强迫供应商解决它。一种选择是编写自己的代理;但这不是一个解决方案,因为您不知道在实现中还有什么其他问题。例如,可能它没有发送相应的CRLF
?