带有 JSON 正文的 GET 方法和带有 RestTemplate 的承载授权

Posted

技术标签:

【中文标题】带有 JSON 正文的 GET 方法和带有 RestTemplate 的承载授权【英文标题】:GET Method with JSON body and Bearer Authorization with RestTemplate 【发布时间】:2019-09-03 15:45:48 【问题描述】:

我知道....这不是最佳做法,但有人要求我这样做:

我正在尝试获取一个端点,该端点接收带有 3 个参数 (int, int, int)json 正文并具有承载身份验证。

标题

header.setContentType(MediaType.APPLICATION_JSON);
header.set("authorization", bearerToken);

实体

HttpEntity<String> entity = new HttpEntity<>(requestjson.toString(), header);

休息模板

ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

System.out.print(entity):

<"1stParam":1,"2ndParam":4881,"3rdParam":0,Content-Type=[application/json], authorization=[Bearer bearerToken]>

除了安全性和所有此类问题之外,该请求还通过RestTemplate 显示400 HTTP response邮递员工作正常

我也试过HttpURLConnection,但遇到了同样的问题。

感谢您的帮助:)

【问题讨论】:

可以使用具体方法:header.setBearerAuth(bearerToken); 【参考方案1】:

我刚刚编写了一个类似的解决方案,所以我很确定我知道这是什么。您必须在 Authorization 标头中包含 Bearer。我认为此代码更改将解决您的问题:

header.set("Authorization", "Bearer " + bearerToken);

我将标题键大写。我不认为这很重要,但我知道大写的版本对我有用。我的代码看起来像这样,并且可以正常工作。

这里的基本思想是Authorization 标头必须始终以正在执行的授权类型开头,以便服务器可以知道您要使用的类型。这是一个 400 错误而不是 404 是有道理的,因为标头在技术上是错误的。

【讨论】:

如果你这么说。如果已经完成,则无法从 OP 提供的内容中得知。由于他没有在他的原始代码中编码他的令牌,我认为它可能已经被编码了。我只是指出需要在令牌之前添加“Bearer”和一个空格。这 7 个字符不得编码。 是的,不记名令牌已编码,我也将“不记名令牌代码”放在标题上,就像我的实体一样,但仍然得到 400 个代码 该死。我以为就是这样,因为几天前我得到了类似的东西。那好吧。这里没有新鲜的想法。 谢谢。我认为真正的问题是无法处理 GETrequest 上的 de JSON 正文的 apache 库,因此甚至不发送它。我会继续寻找。

以上是关于带有 JSON 正文的 GET 方法和带有 RestTemplate 的承载授权的主要内容,如果未能解决你的问题,请参考以下文章

如何在GuzzleHttp中仅返回正文内容?

Mongoose .find 带有 req.params 数组?和 res.json 每个值和计数的数组?

如何在 javascript fetch() 方法上传递带有 url 的变量?

Ruby:带有 JSON 正文的 PUT 请求?

如何发送带有 URL 参数和 JSON 正文的 POST? [关闭]

带有标头和原始 json 正文的 Volley POST 请求