java RestTemplate带编码URL的GET请求

时间:2017-09-05 06:57:03

标签: java spring-mvc spring-boot resttemplate

我遇到过类似的问题,但他们似乎没有提供直接的例子。我正在尝试使用RestTemplate与编码的URL进行GET。我有一个amazon类助手来生成一个签名的url,但返回编码的url,所以当我在RestTemplate中使用它时,它会被再次编码。我应该提供给RestTemplate的网址应该是这样的;

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=REMOVED&AssociateTag=REMOVED&Keywords=php&Operation=ItemSearch&ResponseGroup=Images,ItemAttributes,Offers&SearchIndex=All&Service=AWSECommerceService&Timestamp=2017-09-05T06:47:25.703Z&Signature=dthAE5BwmK2aZmSoIPRBwsPgCNwIv6JnXoqjC0QyRCQ=

但我的亚马逊助手给了我这个;

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=REMOVED&AssociateTag=REMOVED&Keywords=php&Operation=ItemSearch&ResponseGroup=Images%2CItemAttributes%2COffers&SearchIndex=All&Service=AWSECommerceService&Timestamp=2017-09-05T06%3A47%3A25.703Z&Signature=dthAE5BwmK2aZmSoIPRBwsPgCNwIv6JnXoqjC0QyRCQ%3D

再次编码打破了我的时间戳。我看到我可以很容易地使用字符串替换,但我正在寻找一种更好的方法。

我的代码看起来像这样;

SignedRequestsHelper helper;

    try {
        helper = SignedRequestsHelper.getInstance(this.ENDPOINT, this.ACCESS_KEY_ID, this.SECRET_KEY);
    } catch (Exception e) {
        return "ERROR";
        //e.printStackTrace();
    }

    String requestUrl = null;

    Map<String, String> params = new HashMap<String, String>();
    ...
    requestUrl = helper.sign(params);
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setErrorHandler(new ResponseErrorHandler());
    ...
    try {
        String response = restTemplate.getForObject(requestUrl, String.class);
    } catch (HttpStatusCodeException exception) {
        return exception.getStatusCode().toString();
    }

1 个答案:

答案 0 :(得分:2)

养成阅读Javadoc的习惯:

  

对于每个HTTP方法,有三种变体:两种接受URI   模板字符串和URI变量(数组或映射),而第三个接受   一个URI。请注意,对于URI模板,假设编码为   必要的,例如restTemplate.getForObject(&#34; http://example.com/hotel   list&#34;)成为&#34; http://example.com/hotel%20list&#34;。这也意味着   URI模板或URI变量已经编码,双重编码   会发生,例如http://example.com/hotel%20list变成了   http://example.com/hotel%2520list)。为了避免使用URI方法   用于提供(或重用)先前编码的URI的变体。准备   这样一个完全控制编码的URI,考虑使用   UriComponentsBuilder。