katit
katit

Reputation: 17915

Sending JSON from Android to .NET WCF with international characters. How?

I'm getting exceptions when I'm trying to POST and my JSON has some international characters.

This is code that I use:

HttpPost request = new HttpPost(serviceURL + url);
            request.addHeader("Authorization", "Basic " + Preferences.getAuthorizationTicket(mContext));
            request.addHeader("DeviceSerialNumber", Utility.getDeviceSerialNumber(mContext));
            request.addHeader("OSVersion", "Android v" + Build.VERSION.RELEASE);

            StringEntity entity = new StringEntity(requestData);
            entity.setContentType("application/json;charset=UTF-8");
            entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8"));
            request.setEntity(entity);

            ResponseHandler<String> handler = new BasicResponseHandler();
            response.Body = mHttpClient.execute(request, handler);
            response.Code = HttpURLConnection.HTTP_OK;
            response.Message = "OK";

And this is error I'm getting:

org.apache.http.client.HttpResponseException: Bad Request at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71) at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616) at com.idatt.common.AsyncProcessor.processPOST(AsyncProcessor.java:550) at com.idatt.common.AsyncProcessor.PostMail(AsyncProcessor.java:367) at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:120) at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:28) at android.os.AsyncTask$2.call(AsyncTask.java:185) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) at java.lang.Thread.run(Thread.java:1096)

When requestData doesn't have any international (russian, polish, etc) letters than it works fine. What do I miss? Or better yet how do I get traffic from emulator captured in Fiddler or something?

Upvotes: 1

Views: 1381

Answers (1)

Jarek Potiuk
Jarek Potiuk

Reputation: 20097

I believe you should specify UTF-8 charset when you create StringEntity:

StringEntity entity = new StringEntity(requestData,"utf-8");

http://developer.android.com/reference/org/apache/http/entity/StringEntity.html#StringEntity(java.lang.String, java.lang.String)

Upvotes: 2

Related Questions