httpsurlconnection在java应用程序中错误地发布字符串

时间:2014-03-29 01:12:54

标签: java servlets post httpsurlconnection

在我的java应用程序中,我使用Httpsurlconnection将一些字符串数据发布到服务器。当我在android上测试这段代码时,它完美无缺。但是,在Java应用程序中它不起作用。客户端java应用程序如下:

public static void main(String[] args) {

    disableSslVerification();
    new HttpsClient().testIt();
}

private void testIt() {

    String https_url = "https://XXX.XX.XXX.XXX:XXXX/XXXXX/TestServlet";
    URL url;
    try {

        url = new URL(https_url);
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        print_content(con, "test");

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

private void print_content(HttpsURLConnection connection, String data) {
    if (connection != null) {

        try {
            connection.setConnectTimeout(6000);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            Charset cSet = Charset.forName("UTF-8");
            byte bytes[] = data.getBytes(cSet);
            connection.setRequestProperty("Content-Length", ""
                    + Integer.toString(bytes.length));
            connection.setRequestProperty("Content-Language", "tr");
            connection.setRequestProperty("Accept-Charset", "UTF-8");

            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);

            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());

            wr.write(bytes);
            wr.flush();
            wr.close();

            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, cSet));
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append(System.getProperty("line.separator"));
            }
            rd.close();
            System.out.println(response.toString());

        } catch (Exception e) {
            System.out.println(e.getMessage());

        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }

    }

}

servlet如下:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String s = getHTML(request);
    try {
        out.print("received data:");
        out.print(s);
    } finally {            
        out.close();
    }
}

private String getHTML(HttpServletRequest request) throws IOException {
    int n = request.getContentLength();
    if (n < 1) {
        return "";
    }

    byte bytes[] = new byte[n];
    request.getInputStream().read(bytes);
    return new String(bytes, "UTF-8");
}

当我运行这个应用程序时,servlet的响应是:

收到的数据:t☐☐☐

始终只将第一个字符正确发送到servlet。相同的代码在android上完美运行。有人可以帮我吗?感谢...

2 个答案:

答案 0 :(得分:0)

request.getInputStream().read(bytes);

您可能需要在循环中执行此操作。至少,检查已读取的字节数。除了第一个char之外,该数组似乎是空的。

  

从输入流中读取一些字节并将其存储到   缓冲阵列b。实际读取的字节数返回为   整数。此方法将阻塞,直到输入数据可用,结束   检测到文件,或抛出异常。

答案 1 :(得分:0)

我无法看到导致此问题的明显问题。

  

有人可以帮我吗?

我建议您采取有条不紊的方法来调查问题。使用数据包嗅探器检查实际通过线路发送的内容。检查请求和响应中的实际标头是否正确。检查请求和响应主体是否真正正确编码为UTF-8 ...

您在调查/证据收集中发现的内容将帮助您找出问题(或问题)发生的位置......这样您就可以在代码的某个部分找到自己的位置。负责。