1.慎用 RestTemplate.getForObject(url, JSONObject.class)( ps: JSONObject 用的是 fastjson )
接口 http://127.0.0.1:8190/test/mock 對應 controller 層方法代碼如下:
@GetMapping( "/mock" )
public String mock(){
return "{\n" +
" \"success\":true,\n" +
" \"message\":\"操作成功!\",\n" +
" \"code\":0,\n" +
" \"result\":{\n" +
" \"realTime\":{\n" +
" \"total\":2324,\n" +
" \"employee\":2300,\n" +
" \"visitor\":24\n" +
" },\n" +
" \"leave\":{\n" +
" \"employee\":100,\n" +
" \"visitor\":5\n" +
" },\n" +
" \"enter\":{\n" +
" \"employee\":1000,\n" +
" \"visitor\":50\n" +
" }\n" +
" },\n" +
" \"timestamp\":1629252023794\n" +
"}";
}
測試代碼如下:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
JSONObject json = this.restTemplate.getForObject(url, JSONObject.class);
System.out.println( "替換之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替換之後:" + json.toJSONString() );
}
輸出:
替換之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替換之後:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
發現 realTime 屬性名沒有修改過來,奇了怪了?
但是發現對 接口的傳回值先轉成字元串,再轉成 json對象是可以的:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
JSONObject json = this.restTemplate.getForObject(url, JSONObject.class);
json = JSONObject.parseObject( json.toJSONString() );
System.out.println( "替換之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替換之後:" + json.toJSONString() );
}
輸出:
替換之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替換之後:{"result":{"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50},"real":{"total":2324,"employee":2300,"visitor":24}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
發現 屬性名 realTime 已經修改為 real 了。
然後發現如果是使用 restTemplate.getForObject 調用接口時将接收參數類型修改為 String,也是可以的:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
String jsonStr = this.restTemplate.getForObject(url, String.class);
JSONObject json = JSONObject.parseObject(jsonStr);
System.out.println( "替換之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替換之後:" + json.toJSONString() );
}
輸入如下:
替換之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替換之後:{"result":{"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50},"real":{"total":2324,"employee":2300,"visitor":24}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
發現 realTime已經修改為 real 了。
難道 restTemplate.getForObject(url, JSONObject.class) 這種不能用了嗎?請知道的大神指教
