【问题标题】:Ballerina, Using Json Response from REST-APIBallerina,使用来自 REST-API 的 Json 响应
【发布时间】:2021-05-27 02:40:06
【问题描述】:

我的教授希望我写一个关于如何部署 Ballerina 服务的小教程。所以我正在努力学习它。我正在使用 1.2 版,我对污点检查的概念和变量类型有点不知所措...

我正在尝试编写一个最小的 REST 服务,其端点从另一个 api 请求 json 数据,然后使用该 JSON 来做事。

到目前为止的工作如下:

service tutorial on new http:Listener(9090) {

    // Resource functions are invoked with the HTTP caller and the incoming request as arguments.
    resource function getName(http:Caller caller, http:Request req) {
   http:Client clientEP = new("https://api.scryfall.com/");

    var resp = clientEP->get("/cards/random");
    if (resp is http:Response) {

        var payload = resp.getJsonPayload();

        if (payload is json) {

            var result = caller->respond(<@untainted>(payload));
        } else {

            log:printError("");
        }
    } else {

        log:printError("");
    }
}

使用从https://api.scryfall.com/cards/random 返回的 JSON 进行响应

但是现在让我们说,我想从该 JSON 中访问单个值。例如。 “姓名”。 如果我尝试这样访问它:payload["name"]

我得到:无效操作:类型 'json' 不支持索引

我刚刚发现,如果我先像这样创建地图,它会起作用:

map mp = 有效载荷;

如果我然后访问 mp["name"] 它可以工作。但为什么?如果您仍然必须创建地图然后投射有效负载,那么 json 类型有什么好处?我将如何访问 json 中的 json?比如mp["data"][0]...无效操作:type 'json'不支持再次索引...

我还在尝试理解污点检查的概念...... 检查内容后,我是否只是将所有被污染的内容都投射到 上? 有时我真的不明白文档试图告诉我什么......

【问题讨论】:

    标签: json wso2 ballerina taint


    【解决方案1】:

    我建议您使用 Ballerina Swan Lake 版本。 Swan Lake 版本包含对各种语言功能的增强。这是涵盖您的用例的示例代码。可以在https://ballerina.io/下载天鹅湖Alpha2

    import ballerina/io;
    import ballerina/http;
    
    service tutorial on new http:Listener(9090) {
        resource function get payload() returns json|error {
            http:Client clientEP = check new ("https://api.scryfall.com/");
            json payload = <json> check clientEP -> get("/cards/random", targetType = json);
    
            // Processing the json payload 
            // Here the type of the `payload.name` expression is json | error
            // You can eliminate with check: it returns from this resource with this error
            json nameField = check payload.name;
            io:println(nameField);
    
            // You can traverse the json tree as follows
            json standardLegality = check payload.legalities.standard;
            io:println(standardLegality);
    
            // colors is an array 
            // The cast is necessary because `check payload.colors` gives you a json
            json colors = <json[]> check payload.colors;
            io:println(colors);
    
            // Responding with the complete payload recived from api.scryfall.com
            return payload;
        }
    }
    

    污点分析可帮助您编写没有安全漏洞的代码。但是,我们在 Swan Lake 版本中禁用了污点分析。如果要启用它,可以使用选项--taint-checkbal build

    【讨论】:

    • 要添加到 Sameera 的回复中,如果您需要有关 Ballerina 中的污点检查的更多信息,请查看以下博客文章:medium.com/ballerina-techblog/…
    • 感谢到目前为止的帮助...我切换到了天鹅湖 - 但所有不同的类型、类型转换等仍然让我感到困惑...代码工作正常,但我真的不明白为什么...或者说:我明白为什么这个例子有效,但是当它变得更复杂时我仍然迷失了......假设我现在有一个字段 payload.data,它包含多个 json 对象。现在假设我要访问第一个。当我这样做时:payload.data[0].name; - 我得到类型“json”不支持索引。这到底是怎么回事?有点令人沮丧的是我没有得到这样的基本概念......@Sameera
    • 知道了... 适用于:json[] data = check payload.data;感觉选错了这么多……这是不好的做法吗?
    • 当前设计要求您在需要时进行所需的演员阵容。所以你的建议是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2019-01-02
    • 1970-01-01
    • 2022-11-13
    • 2023-04-07
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多