как (просто) сгенерировать HTTP-запрос POST из java для загрузки файла

Я хотел бы загрузить файлы из java-приложения/апплета, используя событие POST http. Я хотел бы избежать использования какой-либо библиотеки, не включенной в SE, если нет другого (выполнимого) варианта.
Пока я придумал только очень простое решение.
– Создайте строку (буфер) и заполните ее совместимым заголовком (http://www.ietf.org/rfc/rfc1867.txt)
— открыть соединение с сервером URL.openConnection() и записать содержимое этого файла в OutputStream.
Мне также нужно вручную преобразовать двоичный файл в событие POST.

Я надеюсь, что есть лучший, более простой способ сделать это?


person user40271    schedule 24.11.2008    source источник
comment
Пожалуйста, объясните, почему вы не хотите использовать внешнюю библиотеку. Очевидно, что это возможно без каких-либо внешних библиотек, но в основном вы будете дублировать работу (скажем) HttpClient (http://hc.apache.org/httpcomponents-client/index.html)   -  person Jon Skeet    schedule 24.11.2008
comment
Я предполагаю, что он хочет избежать использования библиотеки, чтобы уменьшить размер апплета, сократив время загрузки.   -  person Serxipc    schedule 24.11.2008


Ответы (2)


Вам нужно использовать классы java.net.URL и java.net.URLConnection.

Несколько хороших примеров можно найти на странице http://java.sun.com/docs/books/tutorial/networking/urls/readingWriting.html

Вот какой-то быстрый и неприятный код:

public void post(String url) throws Exception {
    URL u = new URL(url);
    URLConnection c = u.openConnection();

    c.setDoOutput(true);
    if (c instanceof HttpURLConnection) {
        ((HttpURLConnection)c).setRequestMethod("POST");
    }

    OutputStreamWriter out = new OutputStreamWriter(
        c.getOutputStream());

    // output your data here

    out.close();

    BufferedReader in = new BufferedReader(
                new InputStreamReader(
                    c.getInputStream()));

    String s = null;
    while ((s = in.readLine()) != null) {
        System.out.println(s);
    }
    in.close();
}

Обратите внимание, что вам все еще может понадобиться urlencode() ваших данных POST, прежде чем записывать их в соединение.

person Alnitak    schedule 27.11.2008

Вам нужно узнать о кодировании с фрагментами, используемом в более новых версиях HTTP. Библиотека Apache HttpClient является хорошей эталонной реализацией для изучения.

person Josh    schedule 24.11.2008