如何设计 RESTful 具有客户端信息的服务器端日志记录功能的服务

How to design RESTful services with server side logging capability of client information

我正在设计 RESTful Web 服务以公开 SOA 架构中的功能。服务的客户登录企业内部网,拥有客户名称、ID 和其他技术信息(我的意思是与业务无关)。

我有一个要求,必须记录对 RESTful 服务的所有调用,并且必须包含客户端 "not business" 信息(id、应用程序名称、登录用户等)。

我想在一个 JSON 对象 "technicalData" 中收集所有技术信息,在另一个 JSON 对象中收集 PUT/POST 的业务数据(数据传输对象) "dto".

将此信息放入请求正文中是否正确?POST、PUT、DELETE?

GET/DELETE 正文中的此信息对请求没有语义意义,因为它们仅用于记录目的 see this answer on SO

示例:

GET    /books?author=AUTHOR

{
    "technicalData": 
    {
        "id": "...",
        "loggedUser": "...",
        "applicationName": "..."
    }
}

POST   /books

{
    "technicalData": 
    {
        "id": "...",
        "loggedUser": "...",
        "applicationName": "..."
    }
    "dto": 
    {
        ...
    }
}

PUT    /books/ID

{
    "technicalData": 
    {
        "id": "...",
        "loggedUser": "...",
        "applicationName": "..."
    }
    "dto": 
    {
        ...
    }
}

DELETE /books/ID

{
    "technicalData": 
    {
        "id": "...",
        "loggedUser": "...",
        "applicationName": "..."
    }
}

通常,调用"technicalData"的信息不会通过请求调用在客户端和服务器之间共享。您应该只共享标识当前会话的请求令牌。该令牌将在服务器上与 loggedUser 等相关...

不,您不应该在每个请求的 body 中传递该信息。您当然不应该在 GET 和 DELETE 调用中将其传递给网络,因为这违反了规范:

sending a payload body on a GET request might cause some existing implementations to reject the request. (RFC 7231)

sending a payload body on a DELETE request might cause some existing implementations to reject the request. (RFC 7231)

像这样的元信息属于 headers。大概您正在使用 Authorization header 或其他识别用户的方式?那会给你用户名。如果没有,也许可以使用 From header would be an appropriate place to store it. Perhaps User-Agent 来指定应用程序。或者,看看使用 JWT,它可以让你嵌入任意信息。