Web services RESTful web服务,用于数据检索的POST

Web services RESTful web服务,用于数据检索的POST,web-services,rest,Web Services,Rest,我正在考虑为现有的纯基于HTTP的web服务创建RESTAPI 到目前为止,客户端可以向服务发送HTTP POST请求以检索数据。这些请求的HTTP主体 包含类似于查询参数的内容。它是一种XML方言。这些查询的大小通常可以超过30KB 此外,查询还需要加密。因此,HTTP GET不能将查询参数作为查询字符串进行传输 我的问题是:如果我使用HTTP POST检索数据,是否违反了REST原则“POST更改服务器状态” 在每次检索操作(成功与否)之后,都会向数据库中的日志表添加一个日志条目 更新 因

我正在考虑为现有的纯基于HTTP的web服务创建RESTAPI

到目前为止,客户端可以向服务发送HTTP POST请求以检索数据。这些请求的HTTP主体 包含类似于查询参数的内容。它是一种XML方言。这些查询的大小通常可以超过30KB

此外,查询还需要加密。因此,HTTP GET不能将查询参数作为查询字符串进行传输

我的问题是:如果我使用HTTP POST检索数据,是否违反了REST原则“POST更改服务器状态”

在每次检索操作(成功与否)之后,都会向数据库中的日志表添加一个日志条目


更新

因此,HTTP GET不能将查询参数作为查询字符串进行传输

正如我从注释和答案中学到的,查询字符串是加密的。但不建议在查询字符串中传输安全敏感数据。

虽然它在技术上违反了REST,但如果您的查询参数很大(听起来好像很大),那么POST可能是唯一的方法。 此外,并非所有客户端都支持使用主体参数获取

ElasticSearch还允许POST查询:

HTTP GET和HTTP POST都可以用于执行带正文的搜索。因为不是所有的客户端都支持GET with body,所以POST也是允许的。

Azure搜索API也是如此

我想指出的一点是,尽管它违背了REST原则,但有时规则会被打破。
您可以将其视为发布(创建)查询;-)

请注意:获取请求/查询字符串

HTTPS会话的整个文本由SSL保护/加密。
这包括查询和标题。

在这方面,POST和GET完全相同。

是的,POST用于创建数据。另外,如果您使用SSL,您不需要担心参数的加密。@Stan-sure,HTTPS使用加密。但URL(包括查询字符串)从未加密。这是客户端必须将查询放入HTTP bodyNo的两个原因之一,它也是加密的。通过querystring传递敏感信息不是一个好主意,但是它可以安全地防止流量嗅探。查询字符串是加密的,但它们存储在accesslogs中-一个小小的补充:GET的语义在和之间略有变化。虽然前一种方法并没有真正禁止使用GET请求发送有效负载,但很多实现都假设它是,因此要么忽略它,要么在有效负载可用时响应错误。然而,新的规范明确指出,有效负载的语义在GET请求中没有定义,可能会破坏旧服务器。