Json 如何利用客户端信息的服务器端日志功能设计RESTful服务

Json 如何利用客户端信息的服务器端日志功能设计RESTful服务,json,rest,jakarta-ee,restful-architecture,Json,Rest,Jakarta Ee,Restful Architecture,我正在设计RESTfulWeb服务,以公开SOA体系结构中的功能。服务的客户机登录到企业内部网,具有客户机名称、ID和其他技术信息(我的意思是与业务无关) 我有一个要求,即对RESTful服务的所有调用都必须被记录,并且必须包含客户端“非业务”信息(id、应用程序名、记录的用户等) 我想收集JSON对象“technicalData”中的所有技术信息,以及另一个JSON对象“dto”中PUT/POST的业务数据(数据传输对象) 将此信息放入GET、POST、put、DELETE的请求正文中是否正确

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

我有一个要求,即对RESTful服务的所有调用都必须被记录,并且必须包含客户端“非业务”信息(id、应用程序名、记录的用户等)

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

将此信息放入GET、POST、put、DELETE的请求正文中是否正确

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

示例:

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等相关…

不,您不应该在每个请求的正文中传递该信息。您当然不应该在GET和DELETE调用中忽略它,因为这违反了规范:

在GET请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。()

在删除请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。()


像这样的元信息属于标题。您可能正在使用
授权
标题或其他识别用户的方法?这将为您提供用户名。如果不是,那么标题可能是存储它的合适位置。也许可以用来指定应用程序。或者,看看如何使用JWT,它可以让您嵌入任意信息。

这是客户机的要求。服务驻留在不知道类型、登录用户、BPM事务ID和其他外部信息的ESB中间件上。如果服务不知道类型、登录用户,则不应记录这些信息,而应仅记录ip和时间戳。这是客户端的要求,我不能说我不想传递体系结构规范所要求的日志信息。我认为这是正确的答案,我会接受。最后一个问题是:如果服务提供商已经开发了一个“框架”,可以读取请求主体JSON部分中的数据,该怎么办?什么是最好的选择:改变所有端点为POST(违反休息,但考虑到所有请求是内联网,而不是可索引,可缓存)或迫使供应商遵守标准的更大的好处?谢谢你的回答。在接受一个答案之前,你应该留出更多的时间来回答其他问题。一些人被劝阻,如果一个已经被接受,就不要回答。至于你的问题,这介于基于意见和无法回答之间。我的意见是,如果只有一个客户,而且永远只有一个客户,你可以做任何你想做的事。我不确定这个问题中的“提供者”是谁,但如果没有那么多信息,我更喜欢使用标题和/或JWT。你说得太早是对的,但在这个例子中,IMHO,你给出了一个完整的答案,这正是我要搜索的。事实上,我的客户已经使用了JWT令牌,但他决定将所有端点“设计”为POST,并将这些数据放在正文中。我对此不满意,但我会活下来的。非常感谢。