简体   繁体   English

Java httpserver在收到POST请求时崩溃

[英]Java httpserver crashes upon receiving POST requests

I am trying to write a simple HTTP server in Java that can handle POST requests. 我正在尝试用Java编写一个可以处理POST请求的简单HTTP服务器。 While my server successfully receives the GET, it crashes on the POST. 当我的服务器成功收到GET时,它会在POST上崩溃。

Here is the server 这是服务器

public class RequestHandler {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/requests", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange t) throws IOException {
            String response = "hello world";
            t.sendResponseHeaders(200, response.length());
            System.out.println(response);
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

And here is the Java code I use to send the POST 这是我用来发送POST的Java代码

// HTTP POST request
private void sendPost() throws Exception {

    String url = "http://localhost:8080/requests";
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    //add reuqest header
    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", USER_AGENT);
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

    String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345";

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'POST' request to URL : " + url);
    System.out.println("Post parameters : " + urlParameters);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();

    //print result
    System.out.println(response.toString());
}

Each time the POST request crashes on this line 每次POST请求在此行崩溃

HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

but when I change the URL to the one provided in the example where I found this it works. 但是,当我将URL更改为示例中提供的URL时,我发现它可以正常工作。

Instead of 代替

HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

Use 使用

HttpURLConnection con = (HttpURLConnection) obj.openConnection();

You are connecting to a URL which is not HTTPS. 您正在连接到非HTTPS的URL。 When you call obj.openConnection() , it decides whether the connection is HTTP or HTTPS, and returns the appropriate object. 当您调用obj.openConnection() ,它会确定连接是HTTP还是HTTPS,并返回相应的对象。 When it's http , it won't return an HttpsURLConnection , so you cannot convert to it. 当它是http ,它不会返回HttpsURLConnection ,因此您无法转换为它。

However, since HttpsURLconnection extends HttpURLConnection , using HttpURLConnection will work for both http and https URLs. 但是,由于HttpsURLconnection扩展了HttpURLConnection ,因此使用HttpURLConnection将同时适用于httphttps URL。 The methods that you are calling in your code all exist int the HttpURLConnection class. 您在代码中调用的方法都存在于HttpURLConnection类中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM