文章將介紹使用RestTempalte
請求介面,如何處理複雜的返回物件(存在物件巢狀)。
以騰訊位置服務逆地址解析為例進行演示,通過程式碼說明如何處理複雜的返回物件)。
如下圖
整個響應結果可視為一個物件,其中包含了result
物件,result
又包含了另外的物件,對於這樣的返回值,該如何進行獲取並使用?
這裡將使用到java內部類
概念,內部類的說明網上也有很多資料,這裡不做額外的說明。
請求程式碼如下
RestTemplate http=new RestTemplate();
Result1 result=http.getForObject("https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=this_is_your_key&get_poi=1",Result1.class);
重點是Result1.class
如何編寫。
... //頭部引入,省略
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result1 {
private Integer status;
private String message;
private String request_id;
private Result result;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result{
private String address;
private FormattedAddress formatted_address;
@Data
@NoArgsConstructor
@AllArgsConstructor
class FormattedAddress{
private String recommend;
private String rough;
}
private AddressComponent address_component;
@Data
@NoArgsConstructor
@AllArgsConstructor
class AddressComponent{
private String nation;
private String province;
private String city;
private String district;
private String street;
private String street_number;
}
}
}
這樣書寫,使用RestTemplate.getForObject
就可以幫助我們將返回值轉換成對應的POJO
Result1.class
型別的物件並完成賦值動作,需要注意這裡使用了lombok
來簡化程式碼,其作用是幫助生成getter
,setter
以及構造器方法,更多資料可自行百度。
注意點
內部類在定義時如果不顯式宣告為public
,無法通過外部類的物件來讀取其中的值。
如下圖
...
public class Result{
private String address;
private FormattedAddress formatted_address;
@Data
@NoArgsConstructor
@AllArgsConstructor
class FormattedAddress{
private String recommend;
private String rough;
}
}
...
其中Result
加了public
標識,而FormattedAddress
沒有,這樣當我們進行如下呼叫時
RestTemplate http=new RestTemplate();
Result1 result=http.getForObject("https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=this_is_your_key&get_poi=1",Result1.class);
System.out.println(result.getResult()); //能夠訪問
System.out.println(result.getResult().getFormatted_address().getRecommend()); //報錯
本作品採用《CC 協議》,轉載必須註明作者和本文連結