当前位置: 首页>>WEB开发>>正文


salesforce Apex REST API返回Map的Map?

Tinker WEB开发 , , , 去评论

问题描述

我正在开发一个定制的顶点REST API,并运行到使用@HttpGet注释我的getAppDefaults方法的问题。当我删除注释并针对getAppDefaults方法运行测试类时,我会收到我的Map of Map。但是我希望从GET请求中返回为JSON结构。

此外,如果我更改方法返回一个String和JSON.serialize(appDefaults),我从REST请求返回一个字符串结果(即,注释工作正常,但我想返回一个JSON结构,而不是一个字符串) 。

@RestResource(urlMapping='/v1.0/AppDefaults/*')
global with sharing class hbAppUserDefaults {

    ... //other internal methods

    @HttpGet
    global static Map<String, Map<String,Object>> getAppDefaults() {
        Map<String, Map<String,Object>> appDefaults = new Map<String, Map<String,Object>>();

        Map<String, String> u = new Map<String, String>(getUserDefaults());        
        Map<String, Object> cases = new Map<String, Object>(getCases());
        Map<String, Object> dashboards = new Map<String, Object>(getDashboards());
        Map<String, Object> robots = new Map<String, Object>(getRobots());

        appDefaults.put('User', u);
        appDefaults.put('Cases', cases);
        appDefaults.put('Dashboards', dashboards);
        appDefaults.put('Robots', robots);

        return appDefaults;
    }    

}

上面的代码编译错误如下:

apex,rest-api,apexrest,Salesforce

任何帮助是极大的赞赏!

最佳解决方案

我用于这种情况的一种技术是直接在响应中设置JSON,而不是依靠框架来进行序列化(你们注意到有一些限制):

@HttpGet 
global static void getAppDefaults() {

    RestResponse res = RestContext.response;
    if (res == null) {
        res = new RestResponse();
        RestContext.response = res;
    }
    try {
        Map<String, Map<String,Object>> appDefaults = ...
        ..
        res.responseBody = Blob.valueOf(JSON.serialize(appDefaults));
        res.statusCode = 200;
    } catch (Exception e) {
        res.responseBody = Blob.valueOf(
                String.valueOf(e) + '\n\n' + e.getStackTraceString()
                );
        res.statusCode = 500;
    }
}

这避免了从方法生成返回String的双重编码。

上述模式的另一个优点(至少在被管理软件包的上下文中)就是如果你以后要更改JSON的结构,你可以依靠方法签名您不能因为global方法一旦打包就无法更改。

An @RestResource Apex class that returns multiple JSON formats中有更多的信息。

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/192146.html,未经允许,请勿转载。
Go