From 65753cfd772546d7d464f85df787d26b53628a72 Mon Sep 17 00:00:00 2001 From: bismy Date: Tue, 25 Jul 2017 17:41:06 +0800 Subject: [PATCH] =?UTF-8?q?[JAV-235]=E8=A7=A3=E5=86=B3query/path=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E8=BD=AC=E7=A0=81=E9=97=AE=E9=A2=98=EF=BC=9B?= =?UTF-8?q?=E4=BB=A5=E5=8F=8Abody=E7=9A=84=E7=BC=96=E7=A0=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codec/param/BodyProcessorCreator.java | 6 ++- .../codec/param/PathProcessorCreator.java | 3 +- .../springmvc/client/SpringmvcClient.java | 9 ++++ .../tests/SpringMvcIntegrationTestBase.java | 48 +++++++++++++++++-- .../reference/CseClientHttpRequest.java | 2 +- 5 files changed, 61 insertions(+), 7 deletions(-) diff --git a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/BodyProcessorCreator.java b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/BodyProcessorCreator.java index 0f57469551e..c7663db4a23 100644 --- a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/BodyProcessorCreator.java +++ b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/BodyProcessorCreator.java @@ -58,7 +58,8 @@ public Object getValue(RestServerRequest request) throws Exception { String contentType = request.getContentType(); if (contentType != null && contentType.startsWith(MediaType.TEXT_PLAIN)) { - return IOUtils.toString(inputStream); + // TODO: we should consider body encoding + return IOUtils.toString(inputStream, "UTF-8"); } return RestObjectMapper.INSTANCE.readValue(inputStream, targetType); } @@ -101,7 +102,8 @@ public Object getValue(RestServerRequest request) throws Exception { if (InputStream.class.isInstance(body)) { InputStream inputStream = (InputStream) body; - return IOUtils.toString(inputStream); + // TODO: we should consider body encoding + return IOUtils.toString(inputStream, "UTF-8"); } return RestObjectMapper.INSTANCE.convertValue(body, targetType); diff --git a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/PathProcessorCreator.java b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/PathProcessorCreator.java index 65f8ac39a5a..cec50cd083d 100644 --- a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/PathProcessorCreator.java +++ b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/PathProcessorCreator.java @@ -17,6 +17,7 @@ package io.servicecomb.common.rest.codec.param; import java.lang.reflect.Type; +import java.net.URLDecoder; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; @@ -39,7 +40,7 @@ public Object getValue(RestServerRequest request) throws Exception { if (value == null) { return null; } - return convertValue(value, targetType); + return convertValue(URLDecoder.decode(value, "UTF-8"), targetType); } @Override diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java index ea7edaa3aa3..f93dae13418 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/io/servicecomb/demo/springmvc/client/SpringmvcClient.java @@ -88,6 +88,10 @@ private static void testController(RestTemplate template, String microserviceNam template.getForObject(prefix + "/controller/sayhi?name={name}", String.class, "world1")); + TestMgr.check("hi hi 中国 [hi 中国]", + template.getForObject(prefix + "/controller/sayhi?name={name}", + String.class, + "hi 中国")); Map params = new HashMap<>(); params.put("name", "world2"); @@ -101,6 +105,11 @@ private static void testController(RestTemplate template, String microserviceNam null, String.class, "world")); + TestMgr.check("hello hello 中国", + template.postForObject(prefix + "/controller/sayhello/{name}", + null, + String.class, + "hello 中国")); HttpHeaders headers = new HttpHeaders(); headers.add("name", "world"); diff --git a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java index f65daf52eea..d96b9d7a38b 100644 --- a/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java +++ b/integration-tests/springmvc-tests/src/test/java/io/servicecomb/demo/springmvc/tests/SpringMvcIntegrationTestBase.java @@ -36,15 +36,16 @@ import io.servicecomb.demo.server.User; import java.io.IOException; import java.time.ZonedDateTime; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; + import org.junit.Test; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; @@ -65,6 +66,18 @@ public void ableToQueryAtRootBasePath() { assertThat(responseEntity.getStatusCode(), is(OK)); assertThat(responseEntity.getBody(), is("Hi Mike")); + + List> convertersOld = restTemplate.getMessageConverters(); + List> converters = new ArrayList<>(); + converters.add(new MappingJackson2HttpMessageConverter()); + restTemplate.setMessageConverters(converters); + responseEntity = restTemplate + .getForEntity(baseUrl + "sayHi?name={name}", String.class, "小 强"); + + assertThat(responseEntity.getStatusCode(), is(OK)); + assertThat(responseEntity.getBody(), is("Hi 小 强")); + + restTemplate.setMessageConverters(convertersOld); } @Test @@ -276,6 +289,19 @@ public void postsEndWithPathParam() { "world"); assertThat(jsonOf(result, String.class), is("hello world")); + + List> convertersOld = restTemplate.getMessageConverters(); + List> converters = new ArrayList<>(); + converters.add(new MappingJackson2HttpMessageConverter()); + restTemplate.setMessageConverters(converters); + result = restTemplate.postForObject( + controllerUrl + "sayhello/{name}", + null, + String.class, + "中 国"); + + assertThat(result, is("hello 中 国")); + restTemplate.setMessageConverters(convertersOld); } @Test @@ -290,6 +316,22 @@ public void ableToPostObjectAsJsonWithRequestVariable() { "hello"); assertThat(jsonOf(result, String.class), is("hello world")); + + List> convertersOld = restTemplate.getMessageConverters(); + List> converters = new ArrayList<>(); + converters.add(new MappingJackson2HttpMessageConverter()); + restTemplate.setMessageConverters(converters); + input = new Person(); + input.setName("中国"); + + result = restTemplate.postForObject( + controllerUrl + "saysomething?prefix={prefix}", + jsonRequest(input), + String.class, + "hello"); + + assertThat(result, is("hello 中国")); + restTemplate.setMessageConverters(convertersOld); } @Test diff --git a/providers/provider-springmvc/src/main/java/io/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java b/providers/provider-springmvc/src/main/java/io/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java index f0300f9b5d3..989af02391a 100644 --- a/providers/provider-springmvc/src/main/java/io/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java +++ b/providers/provider-springmvc/src/main/java/io/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java @@ -152,7 +152,7 @@ private CseClientHttpResponse invoke(RequestMeta requestMeta, Object[] args) { requestMeta.getOperationMeta(), args); invocation.getHandlerContext().put(RestConst.REST_CLIENT_REQUEST_PATH, - this.uri.getPath() + "?" + this.uri.getQuery()); + this.uri.getRawPath() + "?" + this.uri.getRawQuery()); if (context != null) { invocation.addContext(context);