tags:

views:

29

answers:

3

Hello

I want to make am HTTP GET request from my J2ME application using HttpConnection class. The problem is that I cannot send russian text in the query string. Here is the example of how I'm sending the request

c = (HttpConnection)Connector.open("http://127.0.0.1:1418/zp.ashx?тест");
InputStream s = c.openInputStream();

The receiving asp.net script receives the query part of the url as %3f%3f%3f%3f

That is 4 identical codes. Definately that's not what I'm sending

So how can I send non-latin text in an http query in J2ME?

Thank you in advance

+1  A: 

You might need to explicitly set a character set in the HTTP header that supports the cyrillic alphabet. You could either use UTF-8 or another charset, such as windows-1251 (although UTF-8 should be the preferred choice).

c.setRequestProperty("Content-type", "application/x-www-form-urlencoded;charset=utf-8");    
c = (HttpConnection)Connector.open("http://127.0.0.1:1418/zp.ashx?тест");

If you use an appropriate charset, the server should be able to properly handle the cyrillic request parameter - provided it too supports this charset.

bunting
+1  A: 

URL can contain only ASCII chars and a few punctuation chars. For other chars, you must %-encode them before adding them in the URL. Use URLEncoder.encode("тест", enc) where the enc parameter is the encoding scheme that the server expects.

irreputable
+1  A: 

Your code

Connector.open("http://127.0.0.1:1418/zp.ashx?тест");

is processed by a java.nio.CharsetDecoder for the ASCII character set, and this decoder replaces all unknown characters with its replacement.

To get the behavior you want, you have to encode the URL before sending it. For example, when your server expects the URLs to be UTF8-encoded:

String encodedParameter = URLEncoder.encode("тест", "UTF-8");
Connector.open("http://127.0.0.1:1418/zp.ashx?" + encodedParameter);

Note that if you have multiple parameters, you have to encode both the parameter names and the parameter values individually, before putting them together with "=" and concatenating them with "&". If you need to encode multiple parameters, this class may be helpful to you:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UrlParamGenerator {
  private final String encoding;
  private final StringBuilder sb = new StringBuilder();
  private String separator = "?";

  public UrlParamGenerator(String charset) {
    this.encoding = charset;
  }

  public void add(String key, String value) throws UnsupportedEncodingException {
    sb.append(separator);
    sb.append(URLEncoder.encode(key, encoding));
    sb.append("=");
    sb.append(URLEncoder.encode(value, encoding));
    separator = "&";
  }

  @Override
  public String toString() {
    return sb.toString();
  }

  public static void main(String[] args) throws UnsupportedEncodingException {
    UrlParamGenerator gen = new UrlParamGenerator("UTF-8");
    gen.add("test", "\u0442\u0435\u0441\u0442");
    gen.add("x", "0");
    System.out.println(gen.toString());
  }
}
Roland Illig