# RequestStep

**RequestStep** узел - это узел для отправки HTTP-запросов. Наш инструмент позволяет гибко сконфигурировать запрос и использовать его как отдельно, так и в составе сценария.&#x20;

### Представление RequestStep узла в дереве проекта

Для создания **RequestStep** узла необходимо в контекстном меню [Folder](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/folder) узла или [Project](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/project) узла выбрать пункт **Add node** -> **RequestStep**.&#x20;

В дереве проекта **RequestStep** узел выглядит следующим образом

![Вид RequestStep узла в дереве](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMn8brxTqg9NyauFGQ%2Fr_1.png?alt=media\&token=bad90b90-b617-484a-be06-772296e84c6f)

Остановимся на узле поподробнее. Цвет левого верхнего кружка указывает на статус HTTP-запроса: серый - если запрос не выполнялся, зеленый - в случае успешного HTTP-кода (например, 200, 201 и т.д.), красный - в случае неудачного HTTP-кода (например, 404, 500 и т.д.). Цвет иконки листочка указывает на статус выполнения дочернего [Assertion](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/assertion) узла: серый - если запуск не выполнялся, зеленый - в случае если после запуска, [Assertion](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/assertion) узел либо отсутствует, либо существует и его выполнение завершилось успешно, красный - в случае, если выполнение [Assertion](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/assertion) узла завершилось с ошибкой (не все проверки были пройдены).

В дереве для данного типа узла доступны следующие пункты меню:

![Контекстное меню для RequestStep узла](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnC-lWL3HbKt7n8v6%2Fr_2.png?alt=media\&token=f7c7f321-6640-4a8f-878f-a45b3e97dc74)

* **Add node.** Добавление узла-потомка. В подменю можно выбрать тип узла.
* **Rename.** Переименовать узел.
* **Duplicate.** Сделать копию узла. Новый узел будет иметь название NodeName \[Copy \[number]].
* **Remove node.** Удалить узел.
* **Run.** Запустить узел.
* [**Share**](https://docs-ru.testmace.com/0.0.1-beta.14/other/import/shared)**.** Поделиться узлом. При это в буфере обмена создается ссылка, которая содержит всю информацию о текущем узле.
* **Show in explorer.** Открыть папку с узлом в файловом менеджере.

### Описание вкладки RequestStep узла

При создании **RequestStep** узла (или при двойном клике по уже существующему) открывается вкладка данного узла. Выглядит она следующим образом:

![Вкладка RequestStep узла](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnEvykjaSi-HmvyaO%2Fr_3.png?alt=media\&token=16228eaa-d70d-4745-ad8c-5532c8f5b6e8)

Рассмотрим подробнее каждую из частей интерфейса.&#x20;

#### Секция конфигурирования запроса

Верхняя часть запроса выглядит следующим образом:

![Верхняя часть запроса](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnHqzZyYcsjZwlpwR%2Fr_4.png?alt=media\&token=2c24d661-d1c9-4da2-b0bf-9dae21081de2)

На скрине выше отмечены следующие пункты

1. Метод запроса. На данный момент поддерживаются следующие методы:
   * **GET** — получение ресурса
   * **POST** — создание ресурса
   * **PUT** — обновление ресурса
   * **DELETE** — удаление ресурса
   * **PATCH** — для частичного изменения ресурса
   * **OPTIONS** — для описания параметров соединения с ресурсом
2. Поле для URL.
3. Кнопка для запуска запроса
4. Кнопка [редактирования переменных](https://docs-ru.testmace.com/0.0.1-beta.14/variables/user-variables)

Ниже представлена панель редактирования заголовков, query параметров, авторизации и тела запроса. Так выглядит данная панель для POST запросов:

![Панель редактирования параметров запроса](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnLAHkLfKFdOIj3XQ%2Fr_5.png?alt=media\&token=3857f903-abe2-44a4-a91a-f03827d78c31)

Данная панель организована в виде вкладок. На данный момент существуют следующие вкладки:

* **Headers** - для редактирования списка HTTP-заголовков
* **Query parameters** - для редактирования списка query параметров
* **Body** - для конфигурирования тела запроса
* **Authorization** - для конфигурирования [авторизаций](https://docs-ru.testmace.com/0.0.1-beta.14/work-with/authorization).
* **Other** - конфигурирование прочих параметров запроса

Вкладки **Headers** и **Query** parameters с точки зрения интерфейса очень похожи - это обычные таблицы с возможностью [массового редактирования](https://docs-ru.testmace.com/0.0.1-beta.14/other/bulk-table-editing) и отключением строк. Отдельно стоит добавить, что заголовки поддерживают механизм установки [HTTP-заголовков по умолчанию](https://docs-ru.testmace.com/0.0.1-beta.14/other/default-http-headers).&#x20;

Вкладка **Other** выглядит следующим образом:

![](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnPKjfaH4wV8iveo2%2Fr_6.jpg?alt=media\&token=88df025b-8b5b-4eb5-8949-05235399c0fb)

На данный момент можно отредактировать параметр **Requires SSL certificates be valid** - проверять валидность SSL-сертификата узла. Параметр по умолчанию: **Inherit**, наследует значение родителя узла, если у родителя задан Inherit, параметр выключен. Возможные варианты:

* Yes — да
* No — нет
* Inherit — наследовать

Отдельно остановимся на вкладке **Body**, которая выглядит следующим образом:

![Вкладка Body](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnT7hfXfRdavga1tf%2Fr_7.png?alt=media\&token=9b1dde6f-51f5-4248-8460-ed5e21f55ddf)

В выпадающем списке можно выбрать тип тела. На данный момент поддерживаются следующие типы

* **JSON** - для отправки JSON данных. Сами данные редактируются в текстовом поле с подсветкой JSON-синтаксиса и с поддержкой [механизма переменных](https://docs-ru.testmace.com/0.0.1-beta.14/variables/user-variables) . При отправке запроса в список HTTP-заголовков добавляется заголовок `Content-Type` со значением `application/json` .
* **Form data** - для редактирования `multipart/form-data` форм. Имеет табличный вид с возможностью [массового редактирования](https://docs-ru.testmace.com/0.0.1-beta.14/other/bulk-table-editing) . В строках таблицы в качестве значения могут выступать как обычные строки, так и ссылки на файлы.
* **Form URL encoded** - для редактирования `application/x-www-form-urlencoded` форм. Имеет табличный вид с возможностью [массового редактирования](https://docs-ru.testmace.com/0.0.1-beta.14/other/bulk-table-editing) .
* **File** - для отправки в теле содержимое файла.
* **XML** - для отправки XML данных. Сами данные редактируются в текстовом поле с подсветкой XML-синтаксиса и с поддержкой [механизма переменных](https://docs-ru.testmace.com/0.0.1-beta.14/variables/user-variables) . При отправке запроса в список HTTP-заголовков добавляется заголовок `Content-Type` со значением `application/xml` .
* **Text** - для отправки текстовых данных. Сами данные редактируются в текстовом поле с поддержкой [механизма переменных](https://docs-ru.testmace.com/0.0.1-beta.14/variables/user-variables) . При отправке запроса в список HTTP-заголовков добавляется заголовок `Content-Type` со значением `text/plain` .

#### Секция конфигурирования ответа

Давайте выполним запрос на url <https://testmace-stage.herokuapp.com/posts> и посмотрим, как выглядит секция ответа:

![Секция ответа RequestStep узла](https://1448546621-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-LiMmi1feMjxGB4KfBAE%2F-LiMnXC3T2KRgRyj96nm%2Fr_8.png?alt=media\&token=94f12efb-b450-4ce2-805b-76b4d2d24327)

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

Нижняя область секции ответа разбита на несколько вкладок:

* **Response body** - содержит тело ответа, представленное различными способами. На данный момент имеются следующие представления тела ответа:
  * **Parsed**- ответ в виде дерева. Каждый лист дерева имеет контекстное меню для создания [Assertion](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/assertion) узлов и для работы с [динамическими переменными](https://docs-ru.testmace.com/0.0.1-beta.14/variables/user-variables/dynamic-variables)
  * **JSON** - JSON-подсветка тела ответа. Существует только в случае, когда тело ответа пришло в формате json.
  * **XML -** XML-подсветка тела ответа. Существует только в случае, когда тело ответа пришло в формате XML.
  * **HTML** - HTML-подсветка тела ответа. Показывается в случае, если тело ответа - HTML-страница
  * **Text** - текстовое представление тела ответа без подсветки&#x20;
  * **Preview** - отрендеренный вариант тела ответа. Показывается в случае, если тело ответа - HTML-страница
* **Response headers** - список HTTP-заголовков ответа
* **Assertions** - список assertion-ов, которые содержатся в дочернем [Assertion](https://docs-ru.testmace.com/0.0.1-beta.14/node-types/assertion) узле.

### Файловое представление

**RequestStep** узел представляет из себя папку с названием узла, внутри которой содержится файл index.yml, имеющий следующий формат:

```javascript
{
  "type": "object",
  "properties": {
    "type": {
      "description": "Type of Folder node",
      "const": "RequestStep",
      "type": "string"
    },
    "assignVariables": {
      "description": "List of variables assignments",
      "type": "array",
      "items": {
        "$ref": "#/definitions/AssignVariable"
      },
      "default": []
    },
    "requestData": {
      "$ref": "#/definitions/IRequestData"
    },
    "authData": {
      "$ref": "#/definitions/IAuthorizationData",
      "description": "Authorization parameters"
    },
    "children": {
      "description": "List of children names",
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    },
    "variables": {
      "$ref": "#/definitions/NodeVariables",
      "description": "Node variables dictionary"
    },
    "name": {
      "description": "Node name",
      "type": "string"
    }
  },
  "required": [
    "assignVariables",
    "authData",
    "children",
    "name",
    "requestData",
    "type",
    "variables"
  ],
  "definitions": {
    "AssignVariable": {
      "type": "object",
      "properties": {
        "path": {
          "description": "Path in $response variable (e.g. body.id)",
          "type": "string"
        },
        "assign": {
          "$ref": "#/definitions/NodeReference",
          "description": "Link on target node (one of parents)"
        },
        "variable": {
          "description": "Name of dynamic variable in target node",
          "type": "string"
        }
      },
      "required": [
        "assign",
        "path",
        "variable"
      ]
    },
    "NodeReference": {
      "type": "object",
      "properties": {
        "refNodePath": {
          "description": "Absolute path to node",
          "type": "string"
        },
        "type": {
          "description": "Marker of reference entity",
          "const": "reference",
          "type": "string",
          "default": "reference"
        }
      },
      "required": [
        "refNodePath",
        "type"
      ]
    },
    "IRequestData": {
      "type": "object",
      "properties": {
        "request": {
          "description": "Common request parameters",
          "type": "object",
          "properties": {
            "method": {
              "$ref": "#/definitions/RequestMethod",
              "description": "HTTP-method"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "method",
            "url"
          ]
        },
        "params": {
          "description": "Query parameters",
          "type": "array",
          "items": {
            "$ref": "#/definitions/NameValueParam"
          }
        },
        "body": {
          "$ref": "#/definitions/IRequestBody",
          "description": "Body parameters"
        },
        "headers": {
          "description": "Headers",
          "type": "array",
          "items": {
            "$ref": "#/definitions/NameValueParam"
          }
        },
        "disabledInheritedHeaders": {
          "description": "Names of disabled headers",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "strictSSL": {
          "$ref": "#/definitions/StrictSSLOptions",
          "description": "Requires SSL certificates be valid"
        }
      },
      "required": [
        "body",
        "disabledInheritedHeaders",
        "headers",
        "params",
        "request",
        "strictSSL"
      ]
    },
    "RequestMethod": {
      "enum": [
        "DELETE",
        "GET",
        "OPTIONS",
        "PATCH",
        "POST",
        "PUT"
      ],
      "type": "string"
    },
    "NameValueParam": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "isChecked": {
          "type": "boolean"
        }
      },
      "required": [
        "name",
        "value"
      ]
    },
    "IRequestBody": {
      "type": "object",
      "properties": {
        "type": {
          "$ref": "#/definitions/RequestBodyType",
          "description": "Type of body"
        },
        "jsonBody": {
          "description": "JSON string of body",
          "type": "string"
        },
        "xmlBody": {
          "description": "XML string of body",
          "type": "string"
        },
        "textBody": {
          "type": "string"
        },
        "formData": {
          "description": "multipart/form-data form",
          "type": "array",
          "items": {
            "$ref": "#/definitions/RequestStepFormData"
          }
        },
        "formURLEncoded": {
          "description": "application/x-www-form-urlencoded form",
          "type": "array",
          "items": {
            "$ref": "#/definitions/NameValueParam"
          }
        },
        "file": {
          "description": "Link on file, which will be used as a content for body",
          "type": "string"
        }
      },
      "required": [
        "file",
        "formData",
        "formURLEncoded",
        "jsonBody",
        "textBody",
        "type",
        "xmlBody"
      ]
    },
    "RequestBodyType": {
      "enum": [
        "File",
        "FormData",
        "FormURLEncoded",
        "Json",
        "Text",
        "Xml"
      ],
      "type": "string"
    },
    "RequestStepFormData": {
      "type": "object",
      "properties": {
        "type": {
          "$ref": "#/definitions/FormDataField"
        },
        "name": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "isChecked": {
          "type": "boolean"
        }
      },
      "required": [
        "name",
        "type",
        "value"
      ]
    },
    "FormDataField": {
      "enum": [
        "File",
        "Text"
      ],
      "type": "string"
    },
    "StrictSSLOptions": {
      "enum": [
        "Inherit",
        "No",
        "Yes"
      ],
      "type": "string"
    },
    "IAuthorizationData": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type"
      ]
    },
    "NodeVariables": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
```
