【发布时间】: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