I prefer simplicity and using the first example but I’d be happy to hear other options. Here’s a few examples:

HTTP/1.1 403 POST /endpoint
{ "message": "Unauthorized access" }
HTTP/1.1 403 POST /endpoint
Unauthorized access (no json)
HTTP/1.1 403 POST /endpoint
{ "error": "Unauthorized access" }
HTTP/1.1 403 POST /endpoint
{
  "code": "UNAUTHORIZED",
  "message": "Unauthorized access",
}
HTTP/1.1 200 (🤡) POST /endpoint
{
  "error": true,
  "message": "Unauthorized access",
}
HTTP/1.1 403 POST /endpoint
{
  "status": 403,
  "code": "UNAUTHORIZED",
  "message": "Unauthorized access",
}

Or your own example.

  • SorteKanin@feddit.dk
    link
    fedilink
    arrow-up
    0
    ·
    2 months ago

    A simple error code is sufficient in all of these cases. The error provided gives no additional information. There is no need for a body for these responses.

    • Kogasa@programming.dev
      link
      fedilink
      arrow-up
      0
      ·
      2 months ago

      There may be a need for additional information, there just isn’t any in these responses. Using a basic JSON schema like the Problem Details RFC provides a standard way to add that information if necessary. Error codes are also often too general to have an application specific meaning. For example, is a “400 bad request” response caused by a malformed payload, a syntactically valid but semantically invalid payload, or what? Hence you put some data in the response body.

      • SorteKanin@feddit.dk
        link
        fedilink
        arrow-up
        1
        ·
        2 months ago

        A plain 400 without explanation is definitely not great UX. But for something like 403, not specifying the error may be intentional for security reasons.