Испытание с использованием уверенности, тело правильно отправлено, но не прочитано приложением - PullRequest
0 голосов
/ 04 мая 2018

Я пользуюсь, будьте уверены, с последней версией Java Java Spring. Я пытаюсь смоделировать вызов для аутентификации с помощью метода post и тела json (contentType is application / json), но когда мой запрос перехватывается моим приложением java spring, тело пусто ... и мои методы аутентификации выдают 401 .. это поведение правильный. Но пустое тело не так.

Я вижу с помощью ngrep и некоторых функций с уверенностью, что все запросы выполнены правильно.

Когда я использую curl, postman или ajax из js client, у меня нет этой проблемы

@EnableAutoConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerImplTest {
    @Test
    public void testUserAuthenticateWitParams200() {

        Map<String, Object> jsonAsMap = new HashMap<>();
        jsonAsMap.put("email", "groschat.eu@gmail.com");
        jsonAsMap.put("password", "groschat93**");

        given().log().all()
                .body(jsonAsMap)
                .contentType("application/json; charset=UTF-8").
        when()

.post(String.format("http://localhost:%s/api/users/authenticate", port))
                .peek().
        then()
                .statusCode(is(200));
    }
}

Вот лог из функции peek ():

Request method: POST
Request URI:    http://localhost:53850/api/users/authenticate
Proxy:          <none>
Request params: <none>
Query params:   <none>
Form params:    <none>
Path params:    <none>
Headers:        Accept=*/* Content-Type=application/json; charset=UTF-8
Cookies:        <none>
Multiparts:     <none>
Body:
{
    "password": "groschat93**",
    "email": "groschat.eu@gmail.com"
}

Вот запрос от инструмента dev внутри chrome

Заголовки запроса:

POST /api/users/authenticate HTTP/1.1
Host: back-spring.dev
Connection: keep-alive
Content-Length: 62
Origin: https://front.dev
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Content-type: application/json
Accept: */*
Referer: https://front.dev/
Accept-Encoding: gzip, deflate, br
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

Запрос полезной нагрузки:

{"email":"martinbryan.eu@gmail.com","password":"groschat93**"}

1 Ответ

0 голосов
/ 08 мая 2018

Проблема была в Tomcat и бесполезной точке с запятой в заголовке Content-Type. Tomcat не смог прочитать тип содержимого с помощью точки с запятой, и ничто не напоминало кодировку. Поэтому, когда запрос был прочитан, на стороне сервера, тип содержимого по умолчанию text / plain. RestAssured

Итак, я изменил tomcat на undertow и больше не пользуюсь гарантией, кроме WebTestClient. Смотрите коды и pom.xml. Источник этой проблемы не ожидался.

@AutoConfigureWebTestClient
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ContextConfiguration(
    classes={
            server_spring.Application.class,
            server_spring.config.WebSecurityConfig.class,
            server_spring.config.GlobalConfiguration.class,
            server_spring.config.MvcConfig.class,
            server_spring.config.WebConfig.class
    })
public class UserControllerImplTest {
    @Autowired
    private WebTestClient webClient;

    @Test
    public void testWithAnotherMethod() {
        Map<String, String> jsonMap = new HashMap();
        jsonMap.put("email","martinbryan.eu@gmail.com");
        jsonMap.put("password","groschat93**");

        webClient
            .post()
            .uri("/api/users/authenticate")
            .header("Origin","https://front.dev")
            .header("Referer","https://front.dev")
            .header("Host", "back-spring.dev")
            .contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromObject(jsonMap))
            .exchange()
            .expectStatus()
            .isOk();
    }
}

Мой pom.xml

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
        <version>RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
...