【问题标题】:Rest assured, how to extract generated token from response body after POST request and set it to header请放心,如何在 POST 请求后从响应正文中提取生成的令牌并将其设置为标头
【发布时间】:2017-06-30 20:09:39
【问题描述】:

执行任何请求,我需要使用POST 请求主体{username:"somename", password:"somepass"} 执行身份验证, 标头Content-Type:application.json 给了我一个带有生成令牌的响应,我需要将其粘贴为第二个标头,类似于Authorization:generated-tokenkjhsdkjfvjbwjbQ== 以获取更多请求。 请你帮我解决一下。

【问题讨论】:

    标签: java api rest-assured


    【解决方案1】:

    对我有用的变体:

    String token = given()
                    .contentType("application/json")
                    .body(new User("someuser" , "123"))
                    .when()
                    .post(RestConfig.baseUrl+"/authentication-url")
                    .then().extract().response().as(TokenResponse.class).getToken();
    
            given()
                    .contentType("application/json")
                    .header("Authorization", token)
                    .get(RestConfig.baseUrl+"/some-path")
                    .then()
                    .statusCode(200)...
    

    【讨论】:

      【解决方案2】:

      我有一个类似的要求,我必须来回传递身份验证令牌,但这是 spring rest 模板,不能放心。为此,我使用了客户端过滤器,它在响应中捕获令牌并将其设置为请求的标头。您可以搜索是否有类似的东西放心,可以完成这项工作。 这是一个示例,https://github.com/rest-assured/rest-assured/wiki/Usage

      自定义身份验证

      Rest Assured 允许您创建自定义身份验证提供程序。您可以通过实现 io.restassured.spi.AuthFilter 接口(最好)并将其应用为过滤器来做到这一点。例如,假设您的安全性包括将两个标头一起添加到一个名为“AUTH”的新标头中(这当然不安全)。然后你可以这样做(Java 8 语法):

      given().
              filter((requestSpec, responseSpec, ctx) -> {
                  String header1 = requestSpec.getHeaders().getValue("header1");
                  String header2 = requestSpec.getHeaders().getValue("header2");
                  requestSpec.header("AUTH", header1 + header2);
                  return ctx.next(requestSpec, responseSpec);
              }).
      when().
              get("/customAuth").
      then().
        statusCode(200);
      

      您要使用 AuthFilter 而不是 Filter 的原因是在执行 given().auth().none() 时会自动删除 AuthFilters。 ...

      【讨论】:

      • 谢谢,放心里面有过滤器,正在研究,怎么用呢
      【解决方案3】:

      我可能误解了这个问题,但从我得到的信息来看,我认为这样的事情应该可行:

      String token =
          given().
                  header("Content-Type", "application/json").
                  body(/* body content goes here */).
          when().
                  post(/* route goes here */).
          then().
                  extract().path("token").toString() 
                  // the above path arg depends on the response you get from the call.
      

      那么下一个调用会是这样的:

          given().
                  header("Content-Type", "application/json").
                  header("Authorization", token).
          when()...etc.
      

      某些细节将取决于 API,但我一直使用这种格式。通常会得到用户 ID 或令牌等的响应,并将其用于将来的调用。

      在放心文档中提取的更多信息:https://github.com/rest-assured/rest-assured/wiki/Usage#extracting-values-from-the-response-after-validation

      【讨论】:

        【解决方案4】:

        如果您想从响应中提取一个参数,那么这应该可以:

        String jsonBody= ( enter request payload here )
        
        ValidatableResponse response = RestAssured.given().baseUri(baseURL)
          .accept("application/json")
          .header("Content-Type","application/json")
          .body(jsonBody).when().post("/auth")
          .then().assertThat().statusCode(200)
          .log().all();
            
         String token=response.extract().path("token");
        

        【讨论】:

          猜你喜欢
          • 2017-11-29
          • 2021-08-03
          • 2020-11-16
          • 1970-01-01
          • 2019-11-26
          • 2017-01-18
          • 2011-09-25
          • 2019-02-20
          • 2018-10-13
          相关资源
          最近更新 更多