2013-06-13 55 views
0

我有一個應用程序接收來自SMPP服務器的消息,並將收到的消息轉發給用戶Web服務。所有用戶都有這樣的數據庫的URL:java中的模板解析URL

http://www.example.com/get.php?from=${originator}&to=${destination}&data=${content} 
http://www.example.com/submit?origin=${originator}&dst=${destination}&cnt=${content} 

他們都有${originator}${destination}${content}在他們的模式。他們可能在URL中還有其他參數。我用Jodd StringTemplateParser從數據庫中獲取用戶的URL後,以取代上述論點:

private StringTemplateParser stp = new StringTemplateParser(); 
private final Map<String, String> args = new HashMap<>(); 

args.put("originator", msg.getOriginator()); 
args.put("destination", msg.getDestination()); 
args.put("content", msg.getContent()); 

String result = stp.parse(deliveryUrl, new MacroResolver() { 
    @Override 
    public String resolve(String macroName) { 
     return args.get(macroName); 
    } 
}); 

然後我使用Apache HTTP客戶端調用用戶網址:

URL url = new URL(result); 
int port = url.getPort(); 
uri = new URI(url.getProtocol(), null, url.getHost(), port == -1 ? 80 : port, url.getPath(), url.getQuery(), null); 

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request = null; 
try { 
    request = new HttpGet(uri); 
    client.execute(request) 
} catch (Exception ex) { 
    if (request != null) { 
     request.releaseConnection(); 
    } 
} 

我試着做一些編碼,因爲用戶可以發送任何包含字符如%$&的文字。問題是當content包含類似hello&x=2&c=3243的用戶只能得到helloURI類將其視爲常規GET查詢參數。誰能幫忙?

回答

1

當您構建新的URI時,您需要對參數值進行編碼。

您可以使用URLEncoder.encode(String)對參數進行編碼。

所以,在你的MacroResolver,只需要返回URLEncoder.encode(map.get(macroName))

0

我覺得你的情況,你需要使用HTTP默認內容的字符集是這樣的代碼

請求=新HTTPGET(URL + 「?」 + URLEncodedUtils.format(的NameValuePair, HTTP.DEFAULT_CONTENT_CHARSET) );