我应该将哪种HTTP方法用于我的REST服务?

时间:2017-11-07 21:00:53

标签: java json rest

您可能已经看过很多与此标题相关的帖子。但是,我认为,我有一个不同的情况需要帮助。我试图通过几个线程来解决我的问题,但找不到任何具体的答案,我可以自信地去。

为了解释,我想发布一个RESTful API,它根据提供的输入细节执行典型的GET操作。此API本质上是幂等的,不会创建,更新或删除任何资源。所以,我理想的选择应该是在这种情况下使用HTTP GET方法。

但是,要使事情变得复杂,我的API将需要一个带有详细信息的大型JSON对象作为请求的一部分,以获取响应所需的信息。不建议将JSON字符串放在请求URI中。因此,我必须把它放在请求体本身。但是,HTTP GET不考虑请求正文内容。并且,我不想(或者不知道我是否应该)对此API使用HTTP POST或PUT,因为API是幂等的,并且不会创建/修改任何资源。

目前,我更倾向于为此目的使用HTTP OPTIONS,但我不确定这是否应该考虑RESTful标准化。

那么,你有什么建议?在这种情况下使用POST或OPTIONS是否可以接受?或者,我应该做点什么?

作为参考,下面是请求数据对象的虚拟样本。

{
"parametersList": {
    "itemRange": {
        "code": "11",
        "start": 100683,
        "end": 168003
    },
    "dateRange": {
        "startDate": "2017-10-01",
        "endDate": "2017-10-31"
    },
    "market": {....},
    "startTimeRange": {...},
    "endTimeRange": {....},
    "serviceType": {....},
    "segmentType": {....},
    "daysOfWeek": {
        "days": ["MON", "WED", "THU", "FRI", "SAT", "SUN"]
    },
    "itemNumber": 0
}
}

上面示例中的{...}表示内部对象结构,可能因数据而异。

3 个答案:

答案 0 :(得分:1)

在这种情况下,您应该使用POST。 通常,如果没有其他方法适用,则使用POST。 OPTIONS有另一个目的,不能在这里使用。

例如,POST也用于大型搜索查询,您可以在其中指定正文中的搜索词

使用POST而不是GET的另一个好例子是在请求中发送敏感数据时。

also have a look at this article

and this question

答案 1 :(得分:1)

进行POST,即使你设法通过GET(创建URI)完成它也不是最佳解决方案,因为可能存在GET请求URL变得太长的情况。

此外,我没有找到任何可行的消息来阻止使用POST进行有效查询的查询。

POST(带有一些其他安全措施)也用于身份验证,不会创建/修改任何资源。因此,将它用于你的问题并不是一个坏习惯。

答案 2 :(得分:0)

这是一个有趣的,因为你需要发送一个大的JSON对象。

获取资源的REST API端点应始终使用带有GET参数的GET端点。您是否有特定原因要尝试发送JSON对象而不是发送参数?

如果您坚持发送JSON对象,我找到了base64编码JSON对象的现有代码示例,然后将其添加到GET参数中。但请注意,如果您尝试发送大量JSON对象,则可能会出现URL长度问题。但它永远不应该这样。在restful API上的GET参数应该总是简单而简短。如果您发送的数据过多,那么REST API的设计就会出现问题,需要仔细考虑。