我想澄清一个用例,我努力使用GET方法进行获取操作。
我被要求构建API以从预定义模板生成消息。在请求中,我收到模板ID和需要替换的动态内容。动态内容因模板ID而异。
我的设计就像
- Method = POST
- 网址格式= / messagegenerator / v1 / templateID
- Body = JSON
形式的动态内容- 响应=纯文字信息
醇>
我遇到的问题:当我使用GET方法时,模板内容应该在具有长度限制的URL中传递。我们希望准备包含更多动态内容的电子邮件。
最终这项服务不会创建任何资源,但我仍然被迫使用POST方法。
我错过了什么吗?
休息标准缺失?
有没有更好的方法呢?
获取网址参数的长度是否有任何限制?
答案 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,您甚至可以管理并返回旧消息!