2015-02-04 2 views
4

Я пытаюсь написать простой HTTP-сервер в Java, который может обрабатывать запросы POST. Пока мой сервер успешно получает GET, он падает на POST.Java httpserver обрабатывает запросы POST

Вот сервер

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

А вот код Java я использую для отправки POST

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

} 

Каждый раз, когда запрос POST происходит сбой на этой линии

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

но когда я меняю URL-адрес на тот, который приведен в примере, где я нашел это, он работает.

+1

И что такое сообщение об ошибке при сбое? Я подозреваю, что проблема заключается в том, что вы не подключаетесь к HTTPS, но вы переходите к 'HttpsURLConnection'. – RealSkeptic

+0

Да, я так считаю, вот ошибка Исключение в теме "main" java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection нельзя отнести к javax.net.ssl.HttpsURLConnection –

+0

если я его изменю к HTTPS он больше не сбой, но запрос зависает бесконечно, любые предложения? –

ответ

3

Вместо

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

Использование

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

Вы подключаетесь к URL, который не является HTTPS. Когда вы вызываете obj.openConnection(), он решает, является ли соединение HTTP или HTTPS, и возвращает соответствующий объект. Когда он будет http, он не вернет HttpsURLConnection, поэтому вы не сможете его преобразовать.

Однако, поскольку HttpsURLconnection расширяет HttpURLConnection, используя HttpURLConnection будет работать для обоих http и https URL. Методы, которые вы вызываете в коде, все существуют в классе HttpURLConnection.

+0

, который исправил его, спасибо тонну! –

Смежные вопросы