ServiceNow REST API: получить список имен столбцов - PullRequest
1 голос
/ 11 июля 2019

В интерфейсе администратора есть обозреватель таблиц и столбцов, который покорно показывает все доступные столбцы для таблицы, например таблицу инцидентов:

Table column browser

Моя конечная цель состоит в том, чтобы иметь возможность запрашивать все поля для данной таблицы, в которую я могу вставить данные (главным образом, вокруг таблиц инцидентов и проблем), сопоставить их с данными, которые у меня есть, а затем вставить запись с PUT к столу. Непосредственная проблема, с которой я сталкиваюсь, заключается в том, что когда я запрашиваю sys_dictionary, как предлагают различные форумы, мне возвращают только подмножество столбцов, которые отображает пользовательский интерфейс.

Запрос почтальона:

https://{{SNOW_INSTANCE}}.service-now.com/api/now/table/sys_dictionary?sysparm_fields=internal_type,sys_name,name,read_only,max_length,active,mandatory,comments,sys_created_by,element&name={{TableName}}&sysparm_display_value=all

Я понимаю, что сокращенный набор результатов имеет какое-то отношение к тому, что они представляют собой реальные столбцы в таблице, а не ссылки на другие таблицы, но я не могу найти никакой документации, описывающей, как получить набор результатов, который пользовательский интерфейс использует с помощью API REST ,

Следующая проблема в том, что я не могу найти пример с примером полезной нагрузки, где все стандартные поля были заполнены для таблицы инцидентов, чтобы я мог заполнить столько полей, сколько у меня есть данные.

1 Ответ

0 голосов
/ 14 июля 2019

Я думаю, что вы могли бы сделать это, создав свой собственный сценарий rest API и итерируя / проверяя поля:

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var queryParams = request.queryParams; 
    var table = queryParams.table;
    var t = new GlideRecord(table);
    t.initialize();
    var fields = t.getElements(); //or getFields if global scope
    var fieldList = [];

    for (var i = 0; i < fields.length; i++) {
        var glideElement = fields[i]; //or field.get(i) if global scope
        var descriptor = glideElement.getED();

        var fldName = glideElement.getName().toString();
        var fldLabel = descriptor.getLabel().toString();
        var fldType = descriptor.getInternalType().toString();
        var canWrite = glideElement.canWrite();

        if (canWrite){
            fieldList.push({
                name: fldName,
                type: fldType,
                label: fldLabel,
                writable: canWrite
            });
        }       

    }

    return fieldList;


})(request, response);

Это должно избавить вас от хлопот по определению наследования полей. Вот пример вывода:

{
  "result": [
    {
      "name": "parent",
      "type": "reference",
      "label": "Parent",
      "writable": true
    },
    {
      "name": "made_sla",
      "type": "boolean",
      "label": "Made SLA",
      "writable": true
    },
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...