gpt4 book ai didi

d - 如何在 Vibe.d 中返回带有 HTTP 代码的 JSON?

转载 作者:行者123 更新时间:2023-12-05 03:00:13 24 4
gpt4 key购买 nike

我不仅要返回 JSON,还要返回 HTTP 响应代码。

我通过 URLRouter 注册 REST 接口(interface):

router.registerRestInterface(new ClientServerAPI);

我的 REST 实现示例:

module clienserverapi.clientserver;

import api.clientserver;
import models.replies.client_versions;

/**
Implementation of Client-Server API.
*/
class ClientServerAPI : IClientServerAPI {
@safe:
ClientVersions getSupportedClientVersions() {
bool[string] unstableFeatures;
return ClientVersions(supportedVersions.dup, unstableFeatures);
}
}

最佳答案

在 REST 接口(interface)生成器中,响应代码是自动处理的,并且由于您无法将 HTTPServerResponse/HTTPServerRequest 参数传递到 REST 方法中,因此您无法控制返回的状态。

但是有一些内置状态需要处理:

  • 200/204根据内容返回
  • 400 参数不匹配的错误请求
  • 404 Not found for unmatched routes
  • 大多数异常都会返回 500 内部服务器错误
  • (在 Debug模式之外)发送未授权/错误请求/禁止

另请参阅:REST interface documentation

并且您可以使用 HTTPStatusException 控制任何状态代码,但是它被视为错误并将导致预定义的错误 json,它具有 statusMessage 作为异常消息集并返回您传递给它的 HTTP 状态代码。 (这可能是你想要的错误处理)

您还可以通过设置 errorHandler 来更改错误的外观。给你的 RestInterfaceSettings 中的 RestErrorHandler 委托(delegate).

或者,根据你想做什么,你可以使用一个 WebInterface,它很像一个 rest 接口(interface),但没有 REST 接口(interface)做的一些便利功能,而是可以完全访问请求/响应参数和基本上可以像普通的 http 路由一样做任何事情,并且有一些您可以使用的其他便利功能。

理论上,如果您想返回带有数据的自定义成功代码,您可以滥用 errorHandler + HTTPStatusException 和有效的 HTTP 状态代码,但我不鼓励这样做,如果您想要的话,而是使用 Web 界面。

但是,如果您只想使用自定义错误代码和自定义但一致的错误页面,那么我肯定会使用带有 errorHandler 的 REST 接口(interface)。

你的 jar 现在看起来像这样:

import vibe.vibe;
import std.uni;

@safe:

void main() {
auto server = new HTTPServerSettings;
server.port = 3000;
server.bindAddresses = ["::1", "127.0.0.1"];
auto router = new URLRouter;

RestInterfaceSettings settings = new RestInterfaceSettings();
// this is how the error page will look on any thrown exception (like HTTPStatusException)
settings.errorHandler = (HTTPServerRequest req, HTTPServerResponse res,
RestErrorInformation error) @safe {
res.writeJsonBody([
// design this however you like
"ok": Json(false),
"error": serializeToJson([
"status": Json(cast(int)error.statusCode),
"message": Json(error.exception.msg),
"parent": Json("/api/something")
])
]);
};
router.registerRestInterface(new Impl, settings);

listenHTTP(server, router);
runApplication();
}

interface RestAPI {
string getGreeting(string name);
}

class Impl : RestAPI {
string getGreeting(string name)
{
// throw an HTTP Bad Request error when name is empty
if (name.length == 0)
throw new HTTPStatusException(HTTPStatus.badRequest, "Name parameter cannot be empty!");
// throw an HTTP Conflict error code when name is Bob
if (sicmp(name, "bob") == 0)
throw new HTTPStatusException(HTTPStatus.conflict, "Server cannot greet Bob!");
return "Hello, " ~ name ~ "!";
}
}

然后您的服务器将响应如下内容:

{
"ok": false,
"error": {
"message": "Server cannot greet Bob!",
"status": 409,
"parent": "/api/something"
}
}

关于d - 如何在 Vibe.d 中返回带有 HTTP 代码的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com