JAVA: данные POST через HTTPS, похоже, не отправляются? - PullRequest
0 голосов
/ 20 марта 2010

У меня проблема с отправкой данных через HTTPS в Java. Ответ сервера одинаков, независимо от того, отправляю ли я запрос. Может быть, кто-то может указать в чем проблема ...

Спасибо!

Основной класс:

package bind;

public class Main {

    public static final String urlString = "https://www.sms.ethz.ch/cgi-bin/sms/send.pl";

    public static void main(String[] args) {

 Message msg = new Message("Alles klar?");
 URL url = new URL(urlString);

 String[][] values = new String[3][2];
 values[0][0] = "action";
 values[0][1] = "listoriginators";
 values[1][0] = "username";
 values[1][1] = "xxxxxx";
 values[2][0] = "password";
 values[2][1] = "xxxxxx";


 Query query = new Query(values);
 System.out.println("Query: " + query.getQuery());

 Request request = new Request(url.getURL(), query.getQuery());


    }
}

Класс запроса:

package bind;

public class Request {
    static private int ic = 0;
    private URL url;

    protected Request(java.net.URL URL, String query){
 ic++;
 if(CONSTANTS.SHOW_LOGS) { System.out.println("log: new instance of 'Message'"); }

 // connect
 try {

     System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
     java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

     javax.net.ssl.HttpsURLConnection connection = (javax.net.ssl.HttpsURLConnection) URL.openConnection();
     connection.setDoInput(true);
     connection.setDoOutput(true);
     connection.setRequestMethod("POST");
     connection.setFollowRedirects(true);

     connection.setRequestProperty("Content-Length", String.valueOf(query.length()));
     connection.setRequestProperty("Content-Type", "application/x-www- form-urlencoded");
     connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

     java.io.DataOutputStream output = new java.io.DataOutputStream(connection.getOutputStream());

     output.writeBytes(query); // <<-- NOTHING CHANGES IF I COMMENT THIS OUT OR NOT !!??!?!

     System.out.println("log: response code: " + connection.getResponseCode());
     System.out.println("log: response message: " + connection.getResponseMessage());

     java.io.DataInputStream input = new java.io.DataInputStream(connection.getInputStream());
     for(int i = input.read(); i != -1; i = input.read()) {
  System.out.print((char)i);
     }
     System.out.print("\n");
     input.close();

 } catch(java.io.IOException e) {
     if(CONSTANTS.SHOW_LOGS) {
  System.out.println("error: unable to connect");
  System.out.println(e);
  e.printStackTrace();
     }
 }

    }
}

Класс URL:

public class URL {
    static private int ic = 0;
    private String URLString;
    private java.net.URL url;

    protected URL(String a_url){
 ic++;

 if(CONSTANTS.SHOW_LOGS) { System.out.println("log: new instance of 'URL'"); }

 setURLString(a_url);
 createURL();
    }

    private void setURLString(String a_url) {
 URLString = a_url;
    }

    private void createURL() {
 try {
     url = new java.net.URL(URLString);
 } catch(java.net.MalformedURLException e) {
     System.out.println("error: invalid URL");
     System.out.println(e);
     e.printStackTrace();
 }
    }

    private void showURL() {
 System.out.println("URL: " + url.getHost() + url.getPath());
    }

    public java.net.URL getURL() {
 return url;
    }

}

PS: в основном отсюда: http://www.java -samples.com / java / POST-toHTTPS-url-free-java-sample-program.htm

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

Вы забыли flush() или, что лучше, close() поток впоследствии (который уже выполняет неявный сброс). Очистка необходима, потому что данные могут быть внутренне буферизированы до определенной длины, и очистка заставляет весь буфер быть фактически записанным в вывод.

Итак, измени

 output.writeBytes(query);

до

 output.writeBytes(query);
 output.close();

На самом деле нормальная идиома - закрывать потоки в блоке finally блока try по мере их получения, чтобы вы могли гарантировать, что они закрываются всякий раз, когда во время записи происходит IOException. Закрытие важно, потому что оно освобождает системные ресурсы.

Stream stream = null; // Can be InputStream, OutputStream, Reader or Writer.
try {
    stream = new SomeStream();
    // ...
} finally {
    if (stream != null) try { stream.close(); } catch (IOException logOrIgnore) {} // You can if necessary bake an utility method taking Closeable or take a look for commons IO.
}

Также см. Учебник Sun Java IO для получения дополнительных базовых уроков и рекомендаций.

1 голос
/ 20 марта 2010

Urk. Может быть, вас убедят использовать вместо * http1 клиента Apache Commons http *

?

Эта ссылка более прямая.

Это намного меньше работы, чем отладка этого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...