使用Post方法为Rest Web服务设置setRequestBody

时间:2017-05-09 06:54:14

标签: javascript json rest soap servicenow

您好我尝试使用post方法创建休息响应,我想动态传递变量而不是硬编码,但我失败的地方是,当我尝试发送数组时使用post方法的Rest Web服务的参数(示例数组[" CN = XXX_XX,OU = XXXXX,OU = 1_XXXX XXXXity组,DC = XXXX,DC =本地"])并且我知道有更好的方法请找到我的代码示例。这是给我一个合适的结果的方法。 第一种方法:(作品) `

 try {
          var r = new sn_ws.RESTMessageV2('SailPoint_IdM', 'post');
          var txt = "{\r\n\t\"workflowArgs\":\r\n\t{\r\n\t\"identityName\":\"SiamR\",\r\n\t\"appName\":\"Active Directory\",\r\n\t\"listEntitlements\":[\"CN=ER_CxxxK,OU=xxxxx,OU=1_xxxxxx Security xxx,DC=xxxx,DC=local\"],\r\n\t\"operation\":\"Add\",\r\n\t\"ticketNumber\":\"RITM1234567\"\r\n\t}\r\n}";
    r.setRequestBody(txt);
    var response = r.execute();
    var ResponseBody = response.getBody();
    var HTTPCode = response.getStatusCode();
    gs.log(ResponseBody);
    gs.log(HTTPCode);

} catch (ex) {
    var message = ex.getMessage();
}

输出:

 Script: {"attributes":{"requestResult":{"status":"Success"}},"complete":false,"errors":null,"failure":false,"metaData":null,"requestID":"2c988d8c5bd47cf7015bebfb64cf01e6","retry":false,"retryWait":0,"status":null,"success":false,"warnings":null}
 Script: 200

2n方法(不起作用):

try {
 var r = new sn_ws.RESTMessageV2('SailPoint_IdM', 'post');
 r.setStringParameter('"listEntitlements"', '["CN=Exxx_xxxK,OU=xxxxion,OU=1_xxxxx Security xxxx,DC=xxx,DC=xxxx"]');
 r.setStringParameter('"identityName"', '"SiarmR"');
 r.setStringParameter('"appName"', '"Active Directory"');
 r.setStringParameter('"ticketNumber"', '"RITM1234567"');
 r.setStringParameter('operation', '"Add"');

//override authentication profile 
//authentication type ='basic'/ 'oauth2'
//r.setAuthentication(authentication type, profile name);

var response = r.execute();
 var responseBody = response.getBody();
 var httpStatus = response.getStatusCode();
gs.log(responseBody );
}
catch(ex) {
 var message = ex.getMessage();
}

输出:

 Script: {"attributes":{"requestResult":{"errors":["An unexpected error occurred: sailpoint.tools.GeneralException: The application script threw an exception: java.lang.NullPointerException: Null Pointer in Method Invocation BSF info: script at line: 0 column: columnNo"],"status":"FAIL","GroupStatus":null,"AppStatus":null}},"complete":false,"errors":["Status : failed\nAn unexpected error occurred: sailpoint.tools.GeneralException: The application script threw an exception: java.lang.NullPointerException: Null Pointer in Method Invocation BSF info: script at line: 0 column: columnNo\n"],"failure":false,"metaData":null,"requestID":null,"retry":false,"retryWait":0,"status":null,"success":false,"warnings":null}

 Script: 200

我正面临着这个参数的问题,因为我试图将其作为aray参数传递给我{' ["CN=Exxx_xxxK,OU=xxxxion,OU=1_xxxxx Security xxxx,DC=xxx,DC=xxxx"]'

如果建议使用第一种方法

,请建议一种实现此方法并动态传递所有变量的方法

1 个答案:

答案 0 :(得分:0)

以下是我的一个功能,用于处理请求端点(url),标题或正文中出现的动态参数;

例如:参数p

var p = {abc: 'def'}; 

和outbuond休息设置:

rest url =  https://xxxx.sss.com/api/showme?name=${abc}
rest headers name =  custom-header; value =  ${abc}
rest body =  {name: "${abc}"}

所以它会将所有$ {abc}替换为' def'

_.isNullOrEmpty - check is obj, string or array is null or empty;
_.loop - loop an obj or array, pass in function(nm/i, val) {}
_.isArray - to check if is array
_.str - convert anything to string
_.rpl - replace all string A to B

restParameters: function (restRequest, obj, endpoint) {
    var _ = this;
    if ((_.isNullOrEmpty(restRequest)) || (_.isNullOrEmpty(obj))) return;
    if (_.isNullOrEmpty(endpoint)) endpoint = restRequest.getEndpoint();
    var body = restRequest.getRequestBody();
    var headers = restRequest.getRequestHeaders();
    _.loop(obj, function(nm, val) {
        if (_.isArray(val)) {
            val = (_.isNullOrEmpty(val)) ? '[]' : JSON.stringify(val);
        } else val = _.str(val);
        //for my case my array pass in as string become: "[\"1\", \"2\"]"
        //comment below if pass in as object
        if (val.contains('"')) val = _.rpl(val, '"', '\\"');

        restRequest.setStringParameterNoEscape(nm, val);
        var sch = '${' + nm + '}';
        endpoint = _.rpl(endpoint, sch, val);
        body = _.rpl(body, sch, val);
        _.loop(headers, function (hn, hv) {
            headers[hn] = _.rpl(hv, sch, val);
        });
    }, true);
    restRequest.setEndpoint(endpoint);
    restRequest.setRequestBody(body);
    _.loop(headers, function (hn, hv) { restRequest.setRequestHeader(hn, hv); });
}