【问题标题】:RestTemplate received response not in jsonRestTemplate 收到的响应不在 json 中
【发布时间】:2021-03-02 02:28:52
【问题描述】:

在 spock 中为我使用 JWT 保护的 rest api 编写集成测试时,我遇到了响应内容类型的问题。对于招摇或邮递员来说没有问题。这只发生在集成测试中。

从测试开始记录:

18:24:57.101 [Test worker] DEBUG org.springframework.web.client.RestTemplate - HTTP POST http://localhost:8080/login
18:24:57.110 [Test worker] DEBUG org.springframework.web.client.RestTemplate - Accept=[text/plain, application/json, application/*+json, */*]
18:24:57.138 [Test worker] DEBUG org.springframework.web.client.RestTemplate - Writing [{login=test, password=test}] as "application/json"
18:24:57.282 [Test worker] DEBUG org.springframework.web.client.RestTemplate - Response 200 OK
18:24:57.284 [Test worker] DEBUG org.springframework.web.client.RestTemplate - Reading to [java.lang.String] as "application/json;charset=ISO-8859-1"

这是来自服务器的响应

<200,###BODY###,[Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", Authorization:###JWT_TOKEN###, X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY", Content-Type:"application/json;charset=ISO-8859-1", Transfer-Encoding:"chunked", Date:"Sun, 31 Jan 2021 16:58:29 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]>

结果我显然收到了:

无法确定当前字符,它不是字符串、数字、数组或对象

这是我的测试:

def 'should login player' (){
    given:
    def credentials = [
            "login"   : "test",
            "password": "test"
    ]

    when:
    def response = sendPost(credentials, "login", String.class)
    def body = parseResponse(response)
    then:
    (body.Authentication as String).contains("Bearer")
}
def rest = new RestTemplate()
def headers = new HttpHeaders()
def url = "http://localhost:8080/"


def setup() {
    rest.messageConverters.add(new FormHttpMessageConverter())
    rest.messageConverters.add(new StringHttpMessageConverter())
    headers.setContentType(APPLICATION_JSON)
    headers.remove("Accept")
    headers.add("Accept", APPLICATION_JSON_VALUE)
}


def sendPost(def body, String endpoint, Class returnType) {
    def httpEntity = new HttpEntity<>(body, headers)
    rest.postForEntity((url + endpoint), httpEntity, returnType)
}

不明白为什么在日志中我可以看到 Accept=[text/plain, application/json, application/*+json, /]

如果我只设置应用程序/json。 即使在successfulyAuthentication 方法中将 contentType 设置为 json 也无济于事。

知道我做错了什么吗?

【问题讨论】:

  • 免责声明:我不是 Spring 用户。 你确定 HttpEntity 构造函数知道如何处理 credentials 作为它的主体参数,因为事实上它的类型是Map(在运行时可能是Groovy 中的LinkedHashMap)?也许您认为它是 JSON,因为映射文字在 Groovy 中看起来非常相似。但事实上并非如此。也许您需要new JsonBuilder(credentials).toString() 之类的东西,或者可以选择更高级的new JsonBuilder(credentials).toPrettyString()。让我知道这是否有帮助,然后我可以将评论转换为答案。
  • 我可以在 spring 方面看到请求已正确处理,您还可以看到作为响应,我有授权确认请求中提供的数据是正确的。不知道为什么响应格式如此怪异。
  • 嗯,我在这些日志中看不到太多内容。顺便说一句,我只是将它们重新格式化为更具可读性。您也没有告诉我异常发生在哪里(堆栈跟踪)。您似乎也审查了###BODY###,我看不到parseResponse 方法的定义。也许您想了解MCVE 是什么,然后编辑您的问题以成为其中的一个。也可以随意分享一个示例 GitHub 存储库。如果这里的人可以重现您的问题,那么您获得准确答案的可能性就会大大增加。
  • 我很感激一些反馈,以结束这个仍然列为未回答的问题。谢谢你。我随后会删除此评论。

标签: java spring groovy jwt spock


【解决方案1】:

抱歉耽搁了。

是的,问题是 parseResponse 的参数。我一直在研究整个响应,而不仅仅是正文。

它应该看起来像def body = parseResponse(response.body)

感谢您抽出宝贵时间进行调查!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2019-06-09
    • 2020-02-07
    • 2016-06-03
    相关资源
    最近更新 更多