天天看點

RestTemplate 踩坑之旅

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) 這種不能用了嗎?請知道的大神指教

RestTemplate 踩坑之旅