【问题标题】:RestTemplate Accessing elements in ResponseRestTemplate 访问响应中的元素
【发布时间】:2020-04-13 07:56:47
【问题描述】:

我最近开始学习 Java 和 Spring boot,并想使用 Spotify api 来获取有关艺术家的信息。

我使用了以下方法并收到了回复


String accessToken = getToken(); // method made to generate token
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> retrieveArtistInfo = restTemplate.exchange("https://api.spotify.com/v1/artists"+"?ids="+Arrays.toString(ids).replace("[", "").replace("]", ""), HttpMethod.GET, request, Object.class);



Response: 

{
"artists": [
{
"headers": {
"Content-Type": [
"application/json; charset=utf-8"
],
"Cache-Control": [
"public, max-age=72437"
],
"X-Robots-Tag": [
"noindex, nofollow"
],
"Access-Control-Allow-Origin": [
"*"
],
"Access-Control-Allow-Headers": [
"Accept, App-Platform, Authorization, Content-Type, Origin, Retry-After, Spotify-App-Version, X-Cloud-Trace-Context"
],
"Access-Control-Allow-Methods": [
"GET, POST, OPTIONS, PUT, DELETE, PATCH"
],
"Access-Control-Allow-Credentials": [
"true"
],
"Access-Control-Max-Age": [
"604800"
],
"content-length": [
"916"
],
"Date": [
"Mon, 13 Apr 2020 07:42:09 GMT"
],
"Via": [
"1.1 google"
],
"Alt-Svc": [
"clear"
]
},
"body": {
"artists": [
{
"external_urls": {
"spotify": "https://open.spotify.com/artist/4q3ewBCX7sLwd24euuV69X"
},
"followers": {
"href": null,
"total": 20399255
},
"genres": [
"latin",
"reggaeton",
"trap latino"
],
"href": "https://api.spotify.com/v1/artists/4q3ewBCX7sLwd24euuV69X",
"id": "4q3ewBCX7sLwd24euuV69X",
"images": [
{
"height": 640,
"url": "https://i.scdn.co/image/23009960c33ef08d5973440cca17985a6c70a515",
"width": 640
},
{
"height": 320,
"url": "https://i.scdn.co/image/8ff3e392402169f239bce72b3d80c701b75150b8",
"width": 320
},
{
"height": 160,
"url": "https://i.scdn.co/image/624dd15f5bdcc1bae5fa47739601f3e0be62ebda",
"width": 160
}
],
"name": "Bad Bunny",
"popularity": 100,
"type": "artist",
"uri": "spotify:artist:4q3ewBCX7sLwd24euuV69X"
}
]
},
"statusCode": "OK",
"statusCodeValue": 200
}
]
}

我可以通过传递retrieveArtistInfo.getBody() 查看响应正文,但我想从我存储的对象中获取流派、外部网址等内容并做出自己的响应,但我不知道该怎么做在访问这些元素时。有人可以提供一些关于如何获得它的提示吗?

【问题讨论】:

    标签: java spring-boot httpresponse spotify resttemplate


    【解决方案1】:

    您正在查看的数据格式称为 JSON。要访问该数据,您需要对其进行解析。 Spring 世界中有很多工具可以解析该数据格式并与之交互。下面几个链接

    JSON 介绍:

    在 Spring 世界中,有很多工具可以自动将这些数据转换为您可以使用的对象。或者您可以将其解析为地图。一些例子(还有其他的):

    【讨论】:

      【解决方案2】:

      可以通过前面 Joe W 所说的解析 json 对象来完成, 使用 com.google.gson

      来做
         ResponseEntity<String> response= restTemplate.getForEntity($url,String.class);//get response as string   
         JsonParser jsonParser = new JsonParser();                 
         JsonObject jo = (JsonObject)jsonParser.parse(response.getBody()); Convert JSON To POJO ( Java Class), which is mapped with JSON properties returned as body from response which you sent request
      

      然后通过对象的getter方法访问属性(以“get”为前缀的函数。
      例如:

          jo.getAsJsonObject("response").getAsJsonArray("artists")
      

      【讨论】:

      • 这是我试过的 ResponseEntity retrieveArtist = restTemplate.exchange("api.spotify.com/v1/…", "").replace("]", ""), HttpMethod.GET, request, Artists 。班级); //这样做是为了看看我是否会从响应中获取 external_urls JsonParser jsonParser = new JsonParser(); JsonObject jo = (JsonObject)jsonParser.parse(String.valueOf(retrieveArtist.getBody()));但现在我得到:“类 com.google.gson.JsonPrimitive 不能转换为类 com.google.gson.JsonObject
      • restTemplate.exchange("api.spotify.com/v1/…", "").replace("]", ""), HttpMethod.GET, request, Artists.class); try -> ResponseEntity&lt;String&gt; responseBody= restTemplate.exchange("api.spotify.com/v1/…", HttpMethod.GET, request, String.class); JsonParser(); JsonObject jo = (JsonObject)jsonParser.parse(String.valueOf(responseBody.getBody())); 我认为您的 Artists 类没有正文,您必须以字符串形式获得响应,然后通过 jsonParser 将其转换为 JSON
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 2019-01-17
      相关资源
      最近更新 更多