2017-06-15 6 views
0

は私のREST APIコードです:渡されたのparamがサービス側で復号されなかった以下は自動的に

@RequestMapping(value = "/get", method = RequestMethod.POST, produces = { "application/json" }) 
     @ApiOperation(value = "get data by key.", notes = "return json string value.") 
     public JsonObjectResponse<String> get(
      @ApiParam(required = true, name = "regionName", value = "region name") @RequestParam("regionName") String regionName, 
      @ApiParam(required = true, name = "key", value = "region key,Default is uuid") @RequestParam("key") String key) throws UnsupportedEncodingException 
     { 
     JsonObjectResponse<String> jr = new JsonObjectResponse<String>(); 
     //key = decodeJsonString(key); // added for junit 
     String val = adfService.onPath(regionName).get(key); 
     jr.setState(StateCode.SUCCESS); 
     jr.setData(JsonObject.create().append(key,val).toJson()); 

     return jr; 
     } 

私はパラメータを渡すためにしようとしている:regionName = /融合/ TABLE1 &キーを= { "fusionTbl1DetailNo": "fusionNo001"、 "PK": "PK0001"}私は威張っ-UIを介して、それを呼び出した場合

  1. が、それは次のように呼ばれる:http://localhost:8080/service/basic/get?regionName=%2Ffusion%2Ftable1&key=%7B%22fusionTbl1DetailNo%22%3A%22fusionNo001%22%2C%22pk%22%3A%22PK0001%22%7D&token=8652493a-4147-43f4-af3a-bcb117fb7d42 それE ncodedパラメータとこれらのパラメータもサーバー側で正しく自動的にデコードできます。

  2. 私は、このAPIのためのテストケースを追加したい場合は、私は以下のようにrestTemplate.exchange方法、コードを使用します。

    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); 
    for (Entry<String, String> entry : queryParamMap.entrySet()) { 
        builder.queryParam(entry.getKey(), entry.getValue()); 
    } 
    if (uriParamMap != null) { 
    
        url = builder.buildAndExpand(uriParamMap).toUriString(); 
    } else { 
        url = builder.toUriString(); 
    } 
    if (StringUtils.isEmpty(requestBody)) { 
        if (bodyParamMap != null) { 
         requestBody = parseMapToParams(bodyParamMap); 
        } else { 
         requestBody = ""; 
        } 
    } 
    HttpHeaders headers = new HttpHeaders(); 
    MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8")); 
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8); 
    // headers.add(HttpHeaders.CONTENT_TYPE, "application/json"); 
    // headers.add("Accept", "application/json"); 
    // headers.set(HttpHeaders.ACCEPT, "application/json"); 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
    // headers.add("Accept-Encoding", "gzip, deflate, br"); 
    headers.set("Accept-Charset", "utf-8"); 
    headers.set("Accept-Encoding", "gzip"); 
    headers.add("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"); 
    headers.add("User-Agent", 
         "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 
    
    headers.add(TestBase.TOKEN_HEADER, TestBase.getTokenId()); 
    HttpEntity<String> request = new HttpEntity<>(body, headers); 
    restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); 
    ResponseEntity<String> response = restTemplate.exchange(url, httpMethod, request, String.class); 
    localresponse.set(response); 
    System.out.println("response:" + response); 
    return response; 
    

私は、パラメータを追加するUriComponentsBuilderを使用し、それがためにURLをフォーマットしますメソッドexchangeの場合はhttp://localhost:8080/service/basic/get?regionName=/fusion/table1&key=%7B%22fusionTbl1DetailNo%22:%22fusionNo001%22,%22pk%22:%22PK0001%22%7Dです。ただし、サーバー側が呼び出しを受け取ったときに、パラメーターkeyをデコードしなかった場合、その値はまだ%7B%22fusionTbl1DetailNo%22:%22fusionNo001%22,%22pk%22:%22PK0001%22%7Dでした。それが理由です?私は:(、追加の設定を追加し、呼び出し闊歩から何の効果もヘッダの設定を比較していない

答えて

0

次のように試してみてください。

ResponseEntity<String> res = restTemplate.exchange("http://localhost:8080/service/basic/get?regionName={arg1}&key={arg2}", HttpMethod.POST, null, String.class,"/fusion/table1", "{\"fusionTbl1DetailNo\":\"fusionNo001\",\"pk\":\"PK0001\"}"); 

arg1arg2

"/fusion/table1""{\"fusionTbl1DetailNo\":\"fusionNo001\",\"pk\":\"PK0001\"}"

に置き換えられます

私はをrequestEntityに送っています。リクエストボディとリクエストパラメータはuriVariablesにありません。

+0

どうもありがとう、のようです。 – Shihong

0

RestTemplateにスプリングドキュメントの読み取り:

を各HTTPメソッドのための3つの変異体が存在する:第三は URIを受け入れながら、両者はURI テンプレート文字列とURI変数(配列やマップ)を受け入れます。 URIテンプレートの場合、エンコーディングは とする必要があります。 restTemplate.getForObject( "http://example.com/hotel list")は "http://example.com/hotel%20list"になります。これはまた、 URIテンプレートまたはURI変数がすでにエンコードされている場合は、二重のエンコーディング が起こることを意味

あなたはURIテンプレートの文字列を取りRestTemplate交換法を使用していて、それゆえエンコードするべきではありませんように見えます

url-string。

URL文字列が最初に交換コールで再び

builder.toUriString() 

にエンコードしています。だから、問題は、クライアント側では、二重エンコーディング、あなたは私を保存し、サーバー側の代わりにtoUriString()使用の

0

上の復号化のない欠如、UriComponentsBuilder.fromUriString(url).queryParam("name","John Doe").build().toString();

関連する問題