输出格式如何在RESTful URL中编码?

时间:2011-06-11 21:25:19

标签: html http url rest

假设我有一个RESTful Web服务,它包含有关可以通过http://example.com/myobject等网址访问的对象的信息。我希望能够以两种格式检索此信息:第一,XML格式的普通数据,其次,作为完整的HTML页面,其中还可能包含一个javascript界面​​来更改对象并使用AJAX将其返回。

实现这一目标的规范方法是什么?我应该在两个不同的网址上发布我的对象,例如http://example.com/myobject?format=xml和... format = html吗? (有没有比使用查询字符串更好的方法来区分这里的URL?)或者发送类似多部分MIME数据的东西是否明智,我可以依赖浏览器能够提取HTML部分吗?或者我可以使用的请求中是否有一些HTTP头字段?

(对于以不同格式发送的PUT或POST请求,由于服务器可以检查格式并相应地解析它,因此更容易。)

3 个答案:

答案 0 :(得分:4)

您也可以使用content negotiation代替查询字符串参数。简而言之,客户端通过请求中的Accept header发送可接受的媒体类型(例如“application / xml,text / html; q = 0.9”),服务器对此进行分析并回复客户端首选媒体类型(此过程称为server-driven negotiation

在进行服务器驱动的协商时,响应应包含Vary header,指示在协商中使用了哪个请求标头

请注意,要使其正常运行,客户端必须发送适当的Accept标头。

答案 1 :(得分:2)

一种恰好易于阅读的方法是使用扩展名:

http://example.com/myobject.html
http://example.com/myobject.xml
http://example.com/myobject.json
etc.

否则,您可以使用请求的已接受内容​​类型,您可以在请求标头中找到该类型,例如: HTML为text/html,XML为text/xml,JSON为text/json,依此类推。这称为Content Negotiation

  

内容协商是HTTP规范中定义的一种机制,可以在同一URI上提供文档的不同版本(或更一般地说,资源),以便用户代理可以指定哪个版本最适合他们的能力。

这会使您的网址变得非常简单,并且在未指定任何其他内容的情况下提供HTML输出(并且通过浏览器访问该网页)。

答案 2 :(得分:0)

您将发现您希望一个HTML页面管理少数或多个XML资源,而不仅仅是一个。因此,请将您的HTML表单粘贴在example.com/stuff和您的XML资源上,例如:example.com/api/thing,object等。或者,如果您希望将XML作为主导航,请将其粘贴在example.com/things上,等等和你的HTML在example.com/things/manager.html或类似的东西。由于Firefox和Chrome具有允许人类用户点击非HTML类型的超链接的插件,因此这变得更加容易。