我们有REST API。我试图找出使用一些特殊字符进行获取的最佳方法。
目前,我们有类似的内容:http://myhost.com/api/book/name=HarryPotter
以上网址工作得很好,但是当查询参数中包含某些特殊字符时会变得很复杂,例如'&amp;'或'/',这将导致“找不到操作匹配请求路径...,HTTP方法:GET,ContentType: / ,接受: / ,”< / p>
代表:http://myhost.com/api/book/name=Dark/Thirty。
这会将'Dark / Thirty'中的'/'视为URL分隔符。
能够搜索此类查询的最佳做法是什么。使用JSON是一种更好的做法,如果是,我应该使用GET还是POST?我认为它应该是POST,因为查询参数中的任何斜杠都被视为Url分隔符。
含义:即使这对GET来说也会失败。 http://myhost.com/api/book/search= { “姓名”= “黑暗/三十”}
因为这实际上不是POST我不想使用它。因为我只是列出符合我的搜索条件而不修改或添加任何内容的书籍。
处理类似问题的指南是什么?
答案 0 :(得分:3)
This link读得很好。实质上,如果您的Dark/Thirty
是标识符(即唯一标识资源),则修改它(以可预测的模式),使其不具有特殊字符;例如,DarkThirty
或dark-thirty
。但是,如果它是一个搜索词,那么你可以更好地服务而不是使其成为RESTful,而只是将其作为普通参数传递;这就是他们的目的。
GET
和POST
之间的区别不在于其中的字符,而是目标是什么。 GET
用于获取内容:它应该没有副作用。搜索或检索页面应为GET
。 POST
影响服务器的更改。您不太需要进行需要发送比URL允许的更多数据的操作,同时不对服务器进行任何更改,而只是呈现新页面(允许Shazam或TinEye等异常)。
处理GET参数中的特殊字符是URL编码的工作;如果您有http://myhost.com/api/search?q=Dark%FThirty进行搜索,那么您的网站就不会那么好了。 REST有两个主要驱动因素,我理解它们:人性化和SEO友好性。搜索也不需要。在我的理解中,存在用于识别资源的REST;查询的搜索结果不是资源。
总结一下,我会选择:
答案 1 :(得分:0)
在您的情况下,网址编码听起来最简单,特别是因为您已经为您的应用设置了一个类似http://myhost.com/api/book/name={internal-identifier}
的网址结构,其中internal-identifier
解析为您的图书名称(已编码) ,当然)。
从REST角度来看,URL是否表示可以返回资源表示集合或唯一标识特定资源的查询并不特别重要。您可以将这种结构用于两者。