16
votes

In Java, I need to use HTTP Post to send request to server, but if in the parameter of the URL contains some special character it throws below Exception

java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "&'"

The code to send data

DefaultHttpClient httpclient = new DefaultHttpClient(); 
   HttpPost httpPost = new HttpPost(URL); 

   String sessionId = RequestUtil.getRequest().getSession().getId();
   String data = arg.getData().toString();

   List<NameValuePair> params = new ArrayList<NameValuePair>();   
   params.add(new BasicNameValuePair(param1, data));
   params.add(new BasicNameValuePair(param2, sessionId));
         httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));           

   HttpResponse response = (HttpResponse) httpclient.execute(httpPost);

And at the server side, i use the below code to read information

 String data = request.getParameter(param1);
   if (data != null) {
    actionArg = new ChannelArg(URLDecoder.decode(data, "UTF-8"));
   }

The code works correctly but if i input some special character like [aああ#$%&'(<>?/.,あああああ], it will throw exception. I wonder if someone could help me some hint to be able to encode and decode special characters?

Thank you very much in advance.

4

4 Answers

9
votes

To encode text for safe passage through the internets:

import java.net.*;
...
try {
    encodedValue= URLEncoder.encode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }

And to decode:

try {
    decodedValue = URLDecoder.decode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }
5
votes

Sadly url encoder will not solve your problem. I had this problem and used a custom utility. I remember this I got from googling ;).

http://www.javapractices.com/topic/TopicAction.do?Id=96

3
votes
String data = request.getParameter(param1);

If this is the servlet API, the parameters have already been decoded. No further handling of percent-encoding is necessary.


I haven't used HttpClient, but ensure it is sending the encoding in the header:

Content-type: application/x-www-form-urlencoded; charset=UTF-8

Or, if you must, set the known encoding before any getParameter calls:

request.setCharacterEncoding("UTF-8");
1
votes

try guava

use com.google.common.net.UrlEscapers

it works fine with chinese

like this:

Escaper escaper = UrlEscapers.urlFragmentEscaper();
String result = escaper.escape(yoururl);