Java 调用HTTP API时,将俄语字符转换为不同的随机英语字符
我正在向HTTP服务器发出Java 调用HTTP API时,将俄语字符转换为不同的随机英语字符,java,servlets,Java,Servlets,我正在向HTTP服务器发出POST请求,但其值为俄语的参数被转换为一些随机的英语字母数字字符。以下是我的代码部分:- URL url = new URL("http", "vlinux", 9608, "/Adjust"); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); con
POST
请求,但其值为俄语的参数被转换为一些随机的英语字母数字字符。以下是我的代码部分:-
URL url = new URL("http", "vlinux", 9608, "/Adjust");
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("User-Agent", "JavaClient/7.0.2/RIIApiClient/1.0.0");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
DataOutputStream dataOut = new DataOutputStream(connection.getOutputStream());
dataOut.writeBytes(urlString);
dataOut.flush();
dataOut.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
System.out.println("SUCCESS...check log");
}
} catch (Exception e) {
System.out.println("Error while executing ");
} finally {
connection.disconnect();
}
我是否没有设置正确的
requestProperty
?您没有在任何地方指定任何字符编码,您使用的是dataOut.writeBytes(urlString)
肯定会对任何非ASCII字符(来自Javadoc)进行篡改:
将字符串作为字符串序列写入基础输出流
字节。字符串中的每个字符都由
丢弃其高8位。如果没有引发异常,则计数器
写入的值按s的长度递增
您的问题不清楚
urlString
的当前内容是什么,以及它是如何生成的。这很重要
Short:
对于请求的准备:
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
reader.readLine()
- 使用
对参数名称和值进行编码urlcoder
- 使用
设置编码OutputStreamWriter
- 使用
以避免处理字节BufferedWriter
String urlString = URLEncoder.encode("word", "UTF-8") + "=" + URLEncoder.encode("молоко", "UTF-8");
DataOutputStream os = new DataOutputStream(connection.getOutputStream());
BufferedWriter dataOut = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
dataOut.write(urlString);
对于响应使用:
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
reader.readLine()
Long:客户端和Servlet示例:
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
reader.readLine()
客户:
package testingThings.formEncoding;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class Client {
public static void main(String[] args) throws IOException {
URL url = new URL("http", "localhost", 8080, "/jee6/EncodingTester");
System.out.println("url: " + url);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestProperty("User-Agent", "JavaClient/7.0.2/RIIApiClient/1.0.0");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
String urlString = URLEncoder.encode("word", "UTF-8") + "=" + URLEncoder.encode("молоко", "UTF-8");
DataOutputStream os = new DataOutputStream(connection.getOutputStream());
BufferedWriter dataOut = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
dataOut.write(urlString);
dataOut.flush();
dataOut.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
System.out.println("SUCCESS...check log");
}
else {
System.out.println("Response Code: " + responseCode);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}
Servlet:
package testingThings.formEncoding;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/EncodingTester")
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/plain; charset=UTF-8");
response.getWriter().append(request.getParameter("word"));
getServletContext().log("param word in servlet:" + request.getParameter("word"));
}
/**
* allow requests just for testing,
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
输出客户端:
url: http://localhost:8080/jee6/EncodingTester
SUCCESS...check log
молоко
输出Servlet:
... ServletContext.log():param word in servlet:молоко