Запрос POST не выполняется (rest-assured test)
у меня есть проблема с выполнением запроса POST с rest-assured.
этот код работает:
given().contentType(ContentType.JSON).body("{"key": "val"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
но я пытался использовать param()
или parameter()
такие методы:
это дает:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
Expected status code <200> doesn't match actual status code <415>.
это:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response.
Try registering a default parser using:
RestAssured.defaultParser(<parser type>);
И Так:
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty
у меня закончились идеи, что не так.
что я пытаюсь сделать, это избегайте написания полных jsons для всех тестов, это будет быстрее, если я могу пропустить все "" и {}. Мой подход верен?
2 ответов
давайте рассмотрим ваш первый пример:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}"). when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
здесь происходит то, что вы ставите { "key" : "val" }
(в виде текста) в тело запроса. Этот текст - JSON. С точки зрения REST Assured вы могли бы также поставить { "key" : "val"
который не является допустимым JSON. Ваш сервер отвечает правильно, так как сервер требует и понимает JSON. Он понимает, что тело должно быть JSON, так как вы передаете JSON как тип содержимого.
Итак, давайте посмотрим на второй пример:
given().parameter("key", "val"). when().post(url + resource).then().assertThat().statusCode(200);
здесь ваш сервис возвращает 415, потому что вам не хватает типа контента JSON. Что происходит, когда вы используете param
или parameter
С POST
это то, что вы создаете параметры формы. Параметры формы также отправляются в теле запроса, но параметры формы не являются JSON! Указание " key " и "val" в качестве параметра формы, как вы делаете, будет таким же, как это:
given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);
так, в ваш второй пример на самом деле есть две проблемы:
- вы не посылаете JSON
- у вас неправильный тип контента
и из-за (2) Вы получаете 415 с сервера
переходим к третьему примеру:
given().parameter("key", "val"). when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
что (возможно) происходит здесь, так это то, что ваш сервер не содержит тело ответа, потому что он ожидает, что запрос будет включать "application/json" в качестве типа контента. Так есть нет тела, чтобы утверждать (запрос неправильный)! Ответ содержит только 415 статус (строка) в качестве заголовка.
что приводит нас к вашему последнему примеру:
RestAssured.defaultParser = Parser.JSON; given().parameter("key", "val"). when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
здесь вы инструктируете будьте уверены, чтобы обработать отсутствующий тип контента как JSON, но проблема (снова) заключается в том, что ваш сервер не возвращает тело ответа вообще, поэтому это не поможет.
устранение:
вы должны поставить поддерживаемый JSON структура отображения объектов (Jackson, Faster Jackson, Simple JSON или Gson) в вашем пути к классам (например jackson-databind
) и просто создать карту, как описано в документация:
Map<String, Object> jsonAsMap = new HashMap<>();
map.put("key", "val");
given().
contentType(ContentType.JSON).
body(jsonAsMap).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
поскольку создание карт на Java довольно многословно, я обычно делаю что-то вроде этого, если у меня есть вложенные карты:
given().
contentType(ContentType.JSON).
body(new HashMap<String,Object>() {{
put("key1, "val1");
put("key2, "val2");
put("key3", asList("val3", "val4"));
put("nested", new HashMap<String,String>() {{
put("key4", "val4");
put("key5", "val5");
}});
}}).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
или вы создаете представление DTO ваших данных и просто передаете объект, чтобы быть уверенным:
MyDTO myDTO = new MyDTO(...);
given().
contentType(ContentType.JSON).
body(myDTO).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
вы можете прочитать больше в документация по отображению объектов.
Я искал ответ, и я тоже это понял ..
добавьте файл в папку src/test/resouces и добавьте этот код в тест . Должно быть все хорошо
URL file = Resources.getResource("ModyNewFieldsReq.json");
String myRequest = Resources.toString(file,Charsets.UTF_8);
Response fieldResponse = given ()
.header("Authorization", AuthrztionValue)
.header("X-App-Client-Id", XappClintIDvalue)
.contentType("application/vnd.api+json")
.body(myRequest).with()
.when()
.post(dataPostUrl)
.then()
.assertThat()
.log().ifError()
.statusCode(200)
.extract().response();
Assert.assertFalse(fieldResponse.asString().contains("isError"));