JAVA Http POST request in UTF-8

My J2EE application can receive a POST request from a JSP page, no problem.

But if I use another Java application to send a POST request, the resulting parameter is not a UTF-8 string.

Here is my code:

URL url = new URL("http://localhost:8080/ITUNLPWebInterface/SimpleApi"); HttpURLConnection cox = (HttpURLConnection) url.openConnection(); cox.setDoInput(true); cox.setDoOutput(true); cox.setRequestMethod("POST"); cox.setRequestProperty("Accept-Charset", "UTF-8"); cox.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); cox.setRequestProperty("charset", "UTF-8"); DataOutputStream dos = new DataOutputStream(cox.getOutputStream()); String query = "tool=ner&input=şaşaşa"; dos.writeBytes(query); dos.close(); 

Am I doing something wrong?

thanks for your reply

+6
source share
5 answers

this job!!!.

 package com.erenerdogan.utils; import com.erenerdogan.webservice.ServiceInterface; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.util.EntityUtils; /** * * @author erenerdogan */ public class WebService { private String server; public WebService(String server) { this.server = server; } private HttpPost createPostRequest(String method, Map<String, String> paramPairs){ // Creating HTTP Post HttpPost httpPost = new HttpPost(server + "/" + method); // Building post parameters List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(paramPairs.size()); for (String key : paramPairs.keySet()){ nameValuePair.add(new BasicNameValuePair(key, paramPairs.get(key))); System.out.println("Key : "+ key + " - Value : "+ paramPairs.get(key) ); } // Url Encoding the POST parameters try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair,"UTF-8")); } catch (UnsupportedEncodingException e) { // writing error to Log e.printStackTrace(); } return httpPost; } public String callServer(String method, Map<String, String> paramPairs) throws ClientProtocolException, IOException{ // Creating HTTP client HttpClient httpClient = new DefaultHttpClient(); HttpParams httpParameters = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 10 * 1000); HttpConnectionParams.setSoTimeout(httpParameters, 3 * 1000); HttpResponse httpResponse = httpClient.execute(createPostRequest(method, paramPairs)); HttpEntity httpEntity = httpResponse.getEntity(); String xml = EntityUtils.toString(httpEntity); return xml; } } 
+8
source

Docs for DataOutputStream.writeBytes(String) say

Writes a string to the underlying output stream as a sequence of bytes. Each character in the string is written out in sequence , discarding its eight bits . If an exception is not thrown, the counter dialed increases by the length s.

Use cox.getOutputStream().write(query.getBytes("UTF-8"));

DataOutputStream is redundant here.

+3
source

try it

 HttpClient client = new DefaultHttpClient(); HttpPost port = new HttpPost("http://localhost:8080/ITUNLPWebInterface/SimpleApi"); List<NameValuePair> parameters = new ArrayList<NameValuePair>(3); parameters.add(new BasicNameValuePair("tool", "ner")); parameters.add(new BasicNameValuePair("input", "şaşaşa")); //post.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); post.setEntity(new UrlEncodedFormEntity(params, "ISO-8859-3")); //try this one HttpResponse resp = client.execute(post); 

https://en.wikipedia.org/wiki/ISO/IEC_8859-3 seems to support your character ş

+2
source

This works with me:

 connection = (HttpURLConnection) url.openConnection(); ... byte[] data = message.getBytes("UTF-8"); ... DataOutputStream wr = new DataOutputStream( connection.getOutputStream()); wr.write(data); wr.close(); 
+1
source

a) "application / x-www-form-urlencoded" does not have a charset parameter; it is substantially limited to ASCII

b) to send non-ASCII characters, you need to encode them in UTF-8 (and not in the default encoding of the client) and percentage - avoid them; see http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#application/x-www-form-urlencoded-encoding-algorithm for details.

0
source

Source: https://habr.com/ru/post/953898/


All Articles