четверг, 23 мая 2024 г.

Что такое pm.sendRequest в Postman

Это выдержка из статьи «Как подготовить данные для запроса в Postman через pre-request». 


Метод pm.sendRequest нужен для того, чтобы асинхронно отправлять запросы в Postman до или после выполнения основного запроса (Pre-request или Post-response скрипты). Документация тут.

Зачем это нужно?

  • Pre-request — подготовить данные для выполнения текущего запроса (перед поиском создаем объект с нужными полями)
  • Post-response — чистим за собой (удаляем созданное в pre-request)

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

// Example with a full-fledged request const postRequest = {   url: 'https://postman-echo.com/post',   method: 'POST',   header: {     'Content-Type': 'application/json',     'X-Foo': 'bar'   },   body: {     mode: 'raw',     raw: JSON.stringify({ key: 'this is json' })   } }; 
pm.sendRequest(postRequest, (error, response) => {   console.log(error ? error : response.json()); });


Если же у вас простой метод get без заголовков, тела и прочего, то его можно сразу прописать внутри sendRequest, без дополнительной переменной:

pm.sendRequest('https://postman-echo.com/get', (error, response) => { if (error) { console.log(error); } else { console.log(response); } });


Попробуем на бесплатной системе Users. Допустим, что мы тестируем метод getUser — получение информации по пользователю. Подготовим наш запрос (если вы раньше не сталкивались с Postman, посмотрите видео «Как отправить REST-запрос за 5 минут» и статью «Что такое JSON»):


Тип метода — POST
URL — http://users.bugred.ru/tasks/rest/getuser 

Body в json:

{

  "email": "test_habr_1@mail.com"

} 

Но, чтобы информацию получить, пользователя вначале нужно создать. А пока мы получаем ошибку: «Пользователь не найден» (если хотите пройти шаги с нуля, то придумайте свой уникальный email, которого пока в системе нету):

Давайте сделаем так, чтобы запрос всегда проходил успешно. То есть перед вызовом метода сначала создадим пользователя. 

Самый простой путь — через метод doregister. Если это делать через обычный запрос, а не pre-request, он будет выглядеть так:


Тип метода — POST URL — http://users.bugred.ru/tasks/rest/doregister  Body в json: {     "name": "Хабр 1",     "email": "test_habr_1@mail.com",     "password": "1" }

 

Теперь перепишем его в pre-request:

const postRequest = {   url: 'http://users.bugred.ru/tasks/rest/doregister',   method: 'POST',   body: {     mode: 'raw',     raw: JSON.stringify({          email: "test_habr_1@mail.com",         name: "Хабр 1",         password: 1     })   } }; pm.sendRequest(postRequest, function (err, res) {   console.log(err ? err : res.json().message); });

 

Добавляем этот код во вкладку «Scripts → Pre-request» и снова нажимаем «Send». И вуаля, запрос выполнен успешно!


Но постойте… А что будет, если я повторно отправлю запрос? И что будет, если pre-request упадет? Давайте проверим!

Отправляем запрос повторно — он проходит успешно. А что было с pre-request? Можно проверить в консоли. Открываем её:

И видим, что наш запрос сначала вызвал метод doregister, который вернул в Body ошибку «email уже существует», а потом всё равно пошел вызов getuser. Значит, вызов запроса не зависит от ошибок в pre-request… Или зависит?

Users — тестовая система, в которой на любой запрос тебе вернется код 200. Это можно проверить, дергая doregister отдельно. При попытке сломать запрос:

  • Поменять URL, удалив последнюю букву — url: 'http://users.bugred.ru/tasks/rest/doregiste'

  • Поменять тип запроса на GET (а там все методы только через POST работают, напомню, что система тестовая)

Мы всегда получаем в ответе «200 ОК». Попробуем всё же сломать систему. Для этого в URL подставим что-то совсем другое, другое API, которое умеет возвращать ошибки. А тело оставим от Users, как раз на нем и свалится.

Я поменяла URL на вызов JIRA и записала это в виде второй переменной (postRequest2). То есть просто добавила в pre-request такой блок кода: 

const postRequest2 = {   url: 'https://testbase.atlassian.net/rest/api/3/issue/TEST-18750',   method: 'POST',   body: {     mode: 'raw',     raw: JSON.stringify({         email: "test_habr_1@mail.com",         name: "Хабр 1",         password: 1     })   } }; pm.sendRequest(postRequest2, function (err, res) {   console.log(err ? err : res.json().message); });

Отправляем запрос — ага, ошибочка!

Так что учтите, что таким образом можно дергать только идемпотентный метод, который не будет падать при повторном вызове. 

Если у вас запрос на создание падает, когда «такая сущность уже есть в базе», то нужно будет оборачивать вызов во всякие условия «если сущность уже есть, пропусти, если нет, создай…». 

Но этот случай выходит за рамки нашей статьи. Сейчас наша цель — просто научиться использовать pre-request скрипты в базовом варианте. И понимать, что с ними будет в том или ином случае. И один запрос мы отправлять уже научились!

См также:

Как в pm.sendRequest() выполнить запросы в нужном порядке — о том, как вызвать 2 запроса подряд

Как подготовить данные для запроса в Postman через pre-request — удобная статья на хабре, состоящая из этих двух мини-статей

Комментариев нет:

Отправить комментарий