如何获取HTTP 404响应的响应内容

4

有没有比直接通过tcp访问主机更简单的方法来获取HTTP 404响应的内容?

以下是带有内容的404响应示例:

HTTP/1.1 404 Object Not Found
Server: CouchDB/1.3.0 (Erlang OTP/R15B03)
Date: Wed, 24 Jul 2013 08:32:50 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 41
Cache-Control: must-revalidate

{"error":"not_found","reason":"missing"}
2个回答

3

Rebol HTTP协议并不是为此设计的,它更适合像在浏览器中阅读内容一样而不是通过HTTP提供服务。

但是,你可以通过修改协议的方式来规避Rebol 2处理不同响应代码的问题:

in-http-scheme: func [does [block!]][
    do bind :does bind? last body-of get in system/schemes/http/handler 'open
]

in-http-scheme [
    remove-each [code response] response-actions [find [400 403 404] code]
    append response-actions [400 success 403 success 404 success]
]

需要注意的是,HTTP协议必须已经被初始化(任何http端口都已打开/读取)。 response-actions 在未初始化 HTTP 时仍然可以访问:

select body-of get in system/schemes/http/handler 'open quote response-actions:

您可以这样获取最后一个响应行:
in-http-scheme [response-line]

如果您打算使用HTTP服务,您需要一个专门设计用于HTTP服务的方案。我有一个REST协议(两个版本,一个使用cURL,另一个使用自定义的HTTP方案,虽然效果不如前者)。不过这些都是为Rebol 2设计的,我正在计划推出Rebol 3版本。


谢谢你的有用回答,Chris。有一个小问题,无论是Firefox还是Chrome都会显示HTTP响应的内容,即使它具有404响应代码。IE9则显示其标准页面未找到消息。我猜这是网络已经发展了,但并不是每个人都跟上了步伐。通过TCP连接似乎是我使用情况下最好的选择。 - Peter W A Wood
事实上,我应该明确指出“就像15年前在浏览器中一样”。 - rgchris

0
Christopher Ross-Gill创建了一个适用于Rebol的REST协议,可以简单地访问所有标头,甚至处理OAuth。在这里查看详细信息。
http://www.ross-gill.com/page/REST_Protocol

很遗憾,目前仅适用于Rebol 2,并且它依赖于使用curl进行http请求。


谢谢回复,约翰。我相信ChrisRG的REST协议调用了curl。我真的在寻找一种仅使用REBOL的解决方案,以便更好地避免降级到REBOL的tcp协议支持。顺便说一下,我真的想获取内容而不是头信息。 - Peter W A Wood
我有一个仅限于Rebol的版本(链接在该文章中)。它不是很好(curl解决方案效果更好)。 - rgchris

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