Rest API GET方法限制

时间:2017-05-09 13:07:43

标签: rest http-post cxf resteasy http-get

我想澄清一个用例,我努力使用GET方法进行获取操作。

我被要求构建API以从预定义模板生成消息。在请求中,我收到模板ID和需要替换的动态内容。动态内容因模板ID而异。

我的设计就像

  
      
  1. Method = POST
  2.   
  3. 网址格式= / messagegenerator / v1 / templateID
  4.   
  5. Body = JSON
  6. 形式的动态内容   
  7. 响应=纯文字信息
  8.   

我遇到的问题:当我使用GET方法时,模板内容应该在具有长度限制的URL中传递。我们希望准备包含更多动态内容的电子邮件。

最终这项服务不会创建任何资源,但我仍然被迫使用POST方法。

我错过了什么吗?

休息标准缺失?

有没有更好的方法呢?

获取网址参数的长度是否有任何限制?

3 个答案:

答案 0 :(得分:1)

虽然标准中没有网址限制,但有关于将网址保留在 2000 字符下的旧建议:What is the maximum length of a URL in different browsers?

要点:在您的情况下,发送 POST请求以及正文中的所有数据是最佳解决方案。将电子邮件正文片段或任何巨大的(如果我理解正确的话)放入网址是非常难看的:)。即使请求在技术上没有改变服务器上的任何内容,也应该使用POST,是的。

答案 1 :(得分:0)

您需要创建一个支持http get方法的新API,因为一个API无法获得比http方法更多的内容。

答案 2 :(得分:0)

正如您所指出的,在REST中,POST方法被认为是创建一个新资源。在您的情况下,即使您没有将内容保留在服务器上,也会通过发布内容生成新的资源“消息”。

但是你在模板上使用POST!这应该创建一个新模板。要解决此问题,请将子资源添加到模板资源,以便表明它是创建的消息。

我甚至会通过在“v1”之后添加“模板”来扩展URL,以更明确地表明它是第一级的“模板”资源。

唯一需要做的改变是修改URL,如下所示:

URL pattern = /messagegenerator/v1/template/<templateID>/message

所以你可以(即使你现在没有实现):

GET on /messagegenerator/v1/template/ -> Deliver a list of templates
POST on /messagegenerator/v1/template/ -> Create a new template
DELETE on /messagegenerator/v1/template/<templateID> -> Remove a template
PUT on /messagegenerator/v1/template/<templateID> -> Modify a template

GET on /messagegenerator/v1/template/<templateID>/message -> Deliver a list of messages
POST on /messagegenerator/v1/template/<templateID>/message -> Create a new message
DELETE on /messagegenerator/v1/template/<templateID>/message/<messageID> -> Remove a message
PUT on /messagegenerator/v1/template/<templateID>/message/<messageID> -> Modify a message

因此,如果您保存并为其分配了ID,您甚至可以管理并返回旧消息!