Java 调用HTTP API时,将俄语字符转换为不同的随机英语字符

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

我正在向HTTP服务器发出
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:молоко