天天看点

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 踩坑之旅