当前位置: 首页 > 知识库问答 >
问题:

使用rest-assured进行测试,正文已正确发送,但应用程序未读取

慕容耘豪
2023-03-14

我使用最新版本的java Spring放心。我尝试用post方法和json body(contentType是应用程序/json)模拟调用进行身份验证,但是当我的请求被我的java Spring应用程序拦截时,主体是空的...但空的身体不是。

我可以通过ngrep和一些函数看到所有请求都正确完成。

当我从js客户端使用curl、postman或ajax时,我没有这个问题

@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"
}

以下是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个答案

景子安
2023-03-14

问题是Tomcat和标题内容类型中无用的分号。Tomcat无法读取带有分号且后面没有字符集的内容类型。因此,在服务器端读取请求时,默认的内容类型为text/plain。重新发行

所以我改变tomcat的暗流,我不使用放心了,但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>
 类似资料:
  • 服务器没有看到我的JSON参数。我用邮差检查服务器,一切正常。

  • 问题内容: 我正在使用ReactJS + Redux,以及Express和Webpack。有一个内置的API,我希望能够从客户端进行REST调用- GET,POST,PUT,DELETE。 使用Redux架构的方式和正确方法是什么?就简化程序,动作创建者,存储和反应路线而言,任何有关流程的良好示例都将非常有帮助。 先感谢您! 问题答案: 最简单的方法是使用package进行操作。这个软件包是一个r

  • 我有一个quarkus应用程序,当我用下面的命令构建应用程序时,进程第一次开始完美地编译quarkus:dev-DskipTests=true 成功启动的日志: 但是当我停下来重新开始这个过程时,过程并没有开始... 启动失败的日志: 当我尝试重新启动机器,然后启动quarkus服务时,它会再次工作。 pom。xml: 如果有人遇到过类似的行为,请告诉我,这可能是什么根源。

  • 更新: 这会导致我的应用程序出现错误,因为其他bean无法初始化。奇怪的是它在Eclipse上运行得很好。 我有一个名为DataService的类,它扩展了JDBCTemplate。在我的DataService构造函数中,我注入了数据源。 我在其他bean中使用这个DataService类来执行DB操作。我的数据源在我的文件中定义 这是我的application.java类 当我尝试使用Maven

  • 根据这个链接,我可以创建一个测试应用程序,Robolectric将自动开始在测试中使用它。我不能让它运转起来。 我正在使用Dagger进行依赖注入,并为和创建了注入包装类。那么我的每个活动都扩展了包装器活动类,而不是简单的旧。

  • 我想在内存使用效率方面比较Java程序的不同实现。有不同的使用场景被表述为JUnit测试用例。实际上,所有的代码都是开源的:https://github.com/headissue/cache2k-benchmark 获取Java程序已用内存的一般方法是:,当然也可以使用JMX接口来获取这些值。 但是,已使用内存的确定值不可靠。可能的原因: 可能有未收集的垃圾 有碎裂,如果GC没有压缩 到目前为止