决定XML或HTML响应的最佳方法是什么?

时间:2009-03-25 20:08:12

标签: web-services api rest

我在URL上有一个人和机器应该能够阅读的资源:

http://example.com/foo-collection/foo001

区分人类浏览器和计算机,返回HTML或特定于域的XML响应的最佳方法是什么?

(1)请求中的Accept type字段?

(2)另外一点URL?例如:

http://example.com/foo-collection/foo001 - >返回HTML
http://example.com/foo-collection/foo001?xml - > return,er,XML

我不希望让读取资源的机器解析HTML(或XHTML)。像googlebot这样的机器应该收到HTML回复。

假设我控制机器读取器是合理的。

4 个答案:

答案 0 :(得分:7)

如果这是您的控制,而不是添加查询参数,为什么不添加文件扩展名:

http://example.com/foo-collection/foo001.html - return HTML
http://example.com/foo-collection/foo001.xml - return XML

除了其他任何东西,这意味着如果有人使用wget获取它或将其从浏览器中保存,它将具有适当的文件名而不会有任何麻烦。

答案 1 :(得分:3)

我的偏好是使它成为URI的第一类部分。这是有争议的,因为在某种意义上,同一资源有多个URI。 “格式”真的是URI的一部分吗?

http://example.com/foo-collection/html/foo001
http://example.com/foo-collection/xml/foo001

这些在Web框架中非常容易处理,该框架具有URI解析以将请求定向到正确的应用程序。

答案 2 :(得分:3)

如果这确实是具有两种不同表示形式的相同资源,则HTTP会根据您的建议邀请您使用the Accept-header。这可能是区分两种不同场景的非常可靠的方法。您可以充分确定用户代理(包括搜索引擎蜘蛛)正确发送Accept-header。

关于您要提供XML的机器代理;他们在你的控制之下吗?在这种情况下,您可以更加确定Accept是否有效。如果他们没有正确设置此标头,您可以将XML设置为默认值。用户代理DO正确设置标题。

我会尝试使用Accept heder,因为这正是Accept标头的用途。


拥有两个不同的URL的问题是,这两个URL代表相同的底层资源并不会自动显现出来。如果用户在一个程序中找到一个URL并将其粘贴到另一个需要XML的程序中,那么这可能会很糟糕。此时,智能用户可能会适当地更改URL,但这只是您不需要的错误源。

答案 3 :(得分:0)

我想说添加一个Query String参数是你最好的选择。自动检测客户端是浏览器(人)还是应用程序的唯一方法是从HTTP请求中读取User-Agent字符串。但是,任何模仿浏览器的应用程序都可以轻松设置这一点,但您无法保证这会起作用。

相关问题