Разделы портала

Онлайн-тренинги

.
Отправка многочастных запросов в RestAssured.Net
20.08.2024 00:00

Автор: Баз Дейкстра (Bas Dijkstra)
Оригинал статьи
Перевод: Ольга Алифанова

Недавно вышла версия RestAssured.Net 4.2.0. Помимо поддержки .NET 8, добавленной ранее, одной из самых значительных перемен стала поддержка создания и отправки многочастных запросов. В этой статье я подробнее расскажу об этом нововведении.

Что такое многочастные запросы?

Многочастные запросы позволяют передавать несколько наборов данных в едином теле запроса, разделив их границами. Как правило, они используются для передачи файлов, а также для отправки разных типов данных в одном запросе – скажем, файла и его метаданных в JSON-формате.

В более ранних версиях RestAssured.Net в запросе нельзя было передать несколько наборов данных, хотя уже можно было отправить один или несколько файлов при помощи многочастного запроса. Мне указали на это в баг-репорте, переданном в мой репозиторий, и я решил глубже разобраться в том, как создаются такие запросы, и как их поддерживает .NET HttpRequestMessage.

В результате поддержка многочастных запросов сильно улучшилась. Разберем несколько примеров.

Пример 1: загрузка файла по-старинке

До версии 4.2.0 RestAssured.Net поддерживал передачу одного или нескольких файлов (но ничего, кроме них) в многочастном теле запроса – вот так:

Given()
    .MultiPart(new FileInfo("to_do.txt"))
.When()
    .Post("https://your.endpoint.com/accepting-multipart")
.Then()
    .StatusCode(201);

Если содержимое файла – ‘Watch Office Space’, то запрос выглядел вот так:

POST https://your.endpoint.com/accepting-multipart HTTP/1.1
Host: your.endpoint.com
Content-Type: multipart/form-data; boundary="c77ca8ba-f32a-4639-9496-875a36162f5a"
Content-Length: 231
 
--c77ca8ba-f32a-4639-9496-875a36162f5a
Content-Type: text/plain
Content-Disposition: form-data;; filename=to_do.txt; filename*=utf-8''to_do.txt
 
Watch Office Space
 
--c77ca8ba-f32a-4639-9496-875a36162f5a--

Доступны перегрузки – можно переопределить контрольное имя по умолчанию (file) и тип содержимого (определяется автоматически, в данном случае text/plain).

Если вы хотите загрузить несколько файлов в одном запросе, можно просто объединить ряд вызовов в цепочку при помощи MultiPart():

Given()
    .MultiPart(new FileInfo("to_do.txt"))
    .MultiPart(new FileInfo("another_file.txt"))
.When()
    .Post("https://your.endpoint.com/accepting-multipart")
.Then()
    .StatusCode(201);

Пример 2: загрузка файлов с дополнительными данными

В RestAssured.Net версии 4.2.0 появился новый способ загрузки многочастных запросов при помощи нового метода MultiPart(string - имя, HttpContent - содержимое). Это позволяет многочастно загружать любые данные, если они имеют тип HttpContent (согласно документации, или, на практике, любой тип, следующий из HttpContent).

К примеру, тот же файл можно загрузить вместе с другими полями:

Given()
    .MultiPart(new FileInfo("Addresses.csv"))
    .MultiPart("projectId", new StringContent("PROJECT-1234"))
    .MultiPart("projectName", new StringContent("MyProject"))
.When()
    .Post("https://your.endpoint.com/accepting-multipart")
.Then()
    .StatusCode(201);

yielding

POST https://your.endpoint.com/accepting-multipart HTTP/1.1
Host: your.endpoint.com
Content-Type: multipart/form-data; boundary="d0da5b48-705f-4d2e-bd02-96a4aa355e2a"
Content-Length: 568
 
--d0da5b48-705f-4d2e-bd02-96a4aa355e2a
Content-Type: text/csv
Content-Disposition: form-data;; filename=Addresses.csv; filename*=utf-8''Addresses.csv
 
Street;Number;ZipCode;City
Kertzmann Circles;4273;20191;Kiaraview
Alan Road;4389;22333;New Hiltonville
Mayer Cliff;4275;66959;Hayleychester
Runolfsdottir Views;4774;23487;North Ilaport
 
--d0da5b48-705f-4d2e-bd02-96a4aa355e2a
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data;
 
PROJECT-1234
--d0da5b48-705f-4d2e-bd02-96a4aa355e2a
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data;
 
MyProject
--d0da5b48-705f-4d2e-bd02-96a4aa355e2a--

Если вы не хотите осуществлять несколько вызовов к MultiPart(), можно также передать объект типа Dictionary<string, HttpContent>:

Dictionary<string, HttpContent> additionalMultipartPayload = new Dictionary<string, HttpContent>()
{
    { "projectId", new StringContent("PROJECT-1234") },
    { "projectName", new StringContent("MyProject") },
};
 
Given()
    .MultiPart(new FileInfo("Addresses.csv"))
    .MultiPart(additionalMultipartPayload)
.When()
    .Post($"{MOCK_SERVER_BASE_URL}/csv-multipart-form-data-additional-fields")
.Then()
    .StatusCode(201);

Другие примеры многочастных запросов можно найти в приемочных тестах RestAssured.Net.

RestAssured.Net находится на NuGet.

Обсудить в форуме