UTF-8中的JAVA Http POST请求

我的J2EE应用程序能够从JSP页面接收POST请求,没问题。

但是如果我使用另一个java应用程序发送POST请求,则收到的参数不是UTF-8字符串。

这里有我的代码:

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(); 

难道我做错了什么?

感谢您的回复

这项工作!!!

 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 paramPairs){ // Creating HTTP Post HttpPost httpPost = new HttpPost(server + "/" + method); // Building post parameters List nameValuePair = new ArrayList(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 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; } } 

DataOutputStream.writeBytes(String)的文档说

将字符串作为字节序列写入基础输出流。 通过丢弃其高8位顺序写出字符串中的每个字符。 如果没有抛出exception,则写入的计数器将增加s的长度。

而是使用cox.getOutputStream().write(query.getBytes("UTF-8"));

DataOutputStream在这里是多余的。

试试这个

 HttpClient client = new DefaultHttpClient(); HttpPost port = new HttpPost("http://localhost:8080/ITUNLPWebInterface/SimpleApi"); List parameters = new ArrayList(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似乎支持你的spechial角色ş

它起作用我:

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

a)“application / x-www-form-urlencoded”没有charset参数; 它基本上限于ASCII

b)要发送非ASCII字符,你需要用UTF-8(不是客户端的默认编码)对它们进行编码, 并对它们进行百分比转义; 有关详细信息,请参见http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#application/x-www-form-urlencoded-encoding-algorithm 。

基于HttpClient的示例“FluentRequests.java”,以及erenerdogan的回答:

 Content content = Request.Post("http://localhost:8080/ITUNLPWebInterface/SimpleApi") .body(new UrlEncodedFormEntity( Form.form() .add("tool", "ner") .add("input", "şaşaşa") .build(), "UTF-8")) .execute().returnContent(); System.out.println(content);