2017-09-05 106 views
2

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

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(); 
    } 

回答

2

获取到的读取Javadoc习惯:

对于每个HTTP方法有三种变体:二接受URI 模板字符串和URI的变量(阵列或地图),而第三个接受 一个URI。请注意,对于URI模板,假定编码是必要的,例如 。 restTemplate.getForObject(“http://example.com/hotel list”)变成“http://example.com/hotel%20list”。这也意味着如果 的URI模板或URI变量已经被编码,则会发生双编码 ,例如, http://example.com/hotel%20list变成 http://example.com/hotel%2520list)。为了避免使用URI方法 变体来提供(或重新使用)先前编码的URI。要准备 这样一个完全控制编码的URI,可以考虑使用 UriComponentsBuilder。

+0

好吧,我看到'getForObject'的3个变体。我见过UriComponentsBuilder。假设我有一个编码网址开始。我如何解码它? – LogicDev

+0

@ user5500750你不会解码它,你会将它转换成一个URI并使用一个接受URI的重载方法。上述措词可以更清楚吗? –

+0

除了我已经有一个由助手创建的编码url。你可以在我的代码中看到。我已经将我的参数提供给返回url的帮助器。我不想创建一个URI模板字符串,然后将其提供给'getForObject'方法。我是Java新手,所以希望我有道理。我意识到你在说什么,但把它放到代码中是问题所在。 – LogicDev