首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Vibe.d中的HTTP代码返回JSON?

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

Stack Overflow用户
提问于 2019-07-13 14:57:29
回答 2查看 356关注 0票数 3

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

我通过URLRouter注册REST接口:

代码语言:javascript
复制
router.registerRestInterface(new ClientServerAPI);

REST实现的示例:

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-13 15:41:09

在REST接口生成器中,响应代码是自动处理的,由于不能将HTTPServerResponse/HTTPServerRequest参数传入REST方法,所以无法控制返回的状态。

但是,有一些内置状态可以处理:

  • 根据内容返回200/204
  • 400次错误匹配参数的请求
  • 404找不到不匹配的路由
  • 在大多数例外情况下返回500个内部服务器错误。
  • (调试模式之外)发送未经授权的/坏请求/禁止

另见:REST接口文档

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

还可以通过将errorHandler设置为RestInterfaceSettings中的RestErrorHandler委托来更改错误的样子。

或者,根据您想要做的事情,您可以使用一个WebInterface,它很像rest接口,但没有REST接口所做的一些方便的功能,而是可以完全访问请求/响应参数,基本上可以执行任何类似于普通http路由的操作,并且还可以使用其他一些方便函数。

理论上,如果您想在数据中返回自定义成功代码,可以滥用errorHandler + HTTPStatusException的有效HTTP代码,但是如果您想要返回自定义成功代码,那么我会劝阻您使用web接口。

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

您现在可以这样做:

代码语言:javascript
复制
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 ~ "!";
    }
}

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

代码语言:javascript
复制
{
    "ok": false,
    "error": {
        "message": "Server cannot greet Bob!",
        "status": 409,
        "parent": "/api/something"
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-07-26 11:02:06

您可以尝试搜索框架,Rest的示例代码:

代码语言:javascript
复制
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);
    }
}

你的回应结构如下:

代码语言:javascript
复制
module app.message.ResultMessage;

struct UserMessage
{
    int id;
    string name;
    string email;
}

回应结果如下:

代码语言:javascript
复制
[ "id": 1, "name": "MyName", "email": "test@domain.com" ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57020260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档