# RequestStep

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

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

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

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

![Вид RequestStep узла в дереве](/files/-LiMn8brxTqg9NyauFGQ)

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

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

![Контекстное меню для RequestStep узла](/files/-LiMnC-lWL3HbKt7n8v6)

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

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

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

![Вкладка RequestStep узла](/files/-LiMnEvykjaSi-HmvyaO)

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

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

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

![Верхняя часть запроса](/files/-LiMnHqzZyYcsjZwlpwR)

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

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

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

![Панель редактирования параметров запроса](/files/-LiMnLAHkLfKFdOIj3XQ)

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

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

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

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

![](/files/-LiMnPKjfaH4wV8iveo2)

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

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

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

![Вкладка Body](/files/-LiMnT7hfXfRdavga1tf)

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

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

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

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

![Секция ответа RequestStep узла](/files/-LiMnXC3T2KRgRyj96nm)

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

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

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

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

**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#"
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-ru.testmace.com/node-types/requeststep.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
