如何在Vibe.d中使用HTTP代码返回JSON?

如何在Vibe.d中使用HTTP代码返回JSON?,d,vibed,D,Vibed,我不仅要返回JSON,还要返回HTTP响应代码 我通过URLRouter注册REST接口: router.registerRestInterface(新的ClientServerAPI); 我的REST实现示例: 模块clienserverapi.clientserver; 导入api.clientserver; 导入models.replies.client\u版本; /** 客户端-服务器API的实现。 */ 类ClientServerAPI:IClientServerAPI{ @安全:

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

我通过URLRouter注册REST接口:

router.registerRestInterface(新的ClientServerAPI);
我的REST实现示例:

模块clienserverapi.clientserver;
导入api.clientserver;
导入models.replies.client\u版本;
/**
客户端-服务器API的实现。
*/
类ClientServerAPI:IClientServerAPI{
@安全:
ClientVersions getSupportedClientVersions(){
bool[string]不稳定特征;
返回ClientVersions(supportedVersions.dup,unstableFeatures);
}
}

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

但是,有些内置状态会得到处理:

  • 根据内容返回200/204
  • 400对不匹配参数的错误请求
  • 404未找到不匹配的路由
  • 大多数异常都返回500内部服务器错误
  • (调试模式之外)发送未经授权/错误请求/禁止
另见:

您可以使用控制任何状态代码,但它被视为错误,并将导致预定义的错误json,该错误json将statusMessage设置为异常消息集,并返回您传递给它的HTTP状态代码。(这可能是错误处理所需的)

您还可以通过将设置为中的RestErrorHandler委托来更改错误的外观

或者,根据您想做什么,您可以使用一个WebInterface,它非常类似于rest接口,但没有rest接口提供的一些方便功能,但是,您可以完全访问请求/响应参数,基本上可以执行任何类似于正常http路由的操作,并且可以使用其他一些方便的函数

从理论上讲,如果您想用数据返回自定义的成功代码,您可以使用有效的HTTP状态代码滥用errorHandler+HTTPStatusException,但我不鼓励这样做,如果您想要的是web接口,那么就使用web接口

然而,如果您想要做的只是使用自定义但一致的错误页面生成自定义错误代码,那么我肯定会使用带有errorHandler的REST接口

现在,您的应用程序可以如下所示:

导入vibe.vibe;
进口标准单位;
@安全:
void main(){
自动服务器=新的HTTPServerSettings;
server.port=3000;
server.bindAddresses=[“::1”,“127.0.0.1”];
自动路由器=新路由器;
RestInterfaceSettings设置=新建RestInterfaceSettings();
//这是错误页面在任何抛出的异常(如HTTPStatusException)上的外观
settings.errorHandler=(HTTPServerRequest-req,HTTPServerResponse-res,
RestErrorInformation错误)@safe{
res.writeJsonBody([
//按你喜欢的方式设计
“ok”:Json(false),
“错误”:序列化为JSON([
“status”:Json(cast(int)error.statusCode),
“message”:Json(error.exception.msg),
“父”:Json(“/api/something”)
])
]);
};
router.registerRestInterface(新Impl,设置);
listenHTTP(服务器、路由器);
运行应用程序();
}
接口重新启动{
字符串getGreeting(字符串名称);
}
类Impl:RestAPI{
字符串getGreeting(字符串名称)
{
//名称为空时引发HTTP错误请求错误
如果(name.length==0)
抛出新的HTTPStatusException(HTTPStatus.badRequest,“名称参数不能为空!”);
//名称为Bob时引发HTTP冲突错误代码
if(sicmp(名称,“bob”)==0)
抛出新的HTTPStatusException(HTTPStatus.conflict,“服务器无法问候Bob!”);
返回“你好,”~name~“!”;
}
}
然后您的服务器将做出如下响应:

{
“ok”:错,
“错误”:{
“消息”:“服务器无法问候Bob!”,
“地位”:409,
“父项”:“/api/something”
}
}

您可以尝试hunt框架,Rest api的示例代码:

module app.controller.myapi;

import hunt.framework;

import app.message.UserMessage;

class MyapiController : Controller
{
    mixin MakeController;

    @Action
    JsonResponse test()
    {
        UserMessage user;
        user.id = 1;
        user.name = "MyName";
        user.email = "test@domain.com";

        return new JsonResponse(user);
    }
}
您的响应结构:

module app.message.ResultMessage;

struct UserMessage
{
    int id;
    string name;
    string email;
}
回应结果如下:

[ "id": 1, "name": "MyName", "email": "test@domain.com" ]