Java: как отправить запрос POST при отображении страницы? - PullRequest
0 голосов
/ 01 августа 2011

Вот мой код:

try
        {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);

            byte[] bytes = os.toByteArray();

            os.flush();
            os.close();

            String code = encode(bytes);

            URL base = applet.getCodeBase();
            URL url = new URL(base.getProtocol(),
                base.getHost(),
                base.getPort(),
                "/image.php?code=" + code);


            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("POST");
            c.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            c.setDoOutput(true);

            DataOutputStream s = new DataOutputStream(c.getOutputStream());
            s.writeBytes("code=" + code);

            applet.getAppletContext().showDocument(url, "_blank");
        }
        catch (Exception e)
        {
            e.printStackTrace();

            JOptionPane.showMessageDialog(
                this,
                e.toString(),
                "Error",
                JOptionPane.ERROR_MESSAGE);
        }

К тому времени, когда я использую showDocument, запрос POST уже выполнен, поэтому я действительно показываю пустую страницу (вместо этого я хочу показать изображение). Источник image.php это:

<?php
$code = base64_decode($_GET["code"]);
header('Content-Type: image/png');
echo $code;
?>

Ответы [ 2 ]

2 голосов
/ 03 октября 2012

Вы используете POST на Java и GET на PHP ...

0 голосов
/ 02 августа 2011

Ваш showDocument и запрос POST апплета полностью независимы. Запрос POST выполняется вашим апплетом, и результат будет использоваться только внутри вашего апплета (но вы его вообще не читаете - и я не уверен, что он даже отправлен).

showDocument, напротив, всегда выполняет запрос GET - здесь нет способа указать браузеру использовать POST. Однако вы можете создать POST-запрос для новой HTML-страницы, используя мост JavaScript из вашего апплета.

Теоретически, это должно работать в любом случае, так как вы отправляете данные изображения также как часть URL, но может быть ограничение длины для данных URL на веб-сервере или в ссылке из Java-Plugin на браузер.

Вместо этого вы можете закодировать ваше изображение в data: URL и использовать его для showDocument.

URL url = new URL("data:image/png;base64," + code);

(Я не проверял, действительно ли класс URL в Java принимает это. Пожалуйста, попробуйте и сообщите. Я полагаю, что к нему применяются те же ограничения длины URL браузера.)


Альтернативой может быть сохранение изображения на сервере (по крайней мере, на короткое время). Затем вы использовали бы свой POST из апплета для загрузки данных, возвращая (сокращая) некоторый уникальный идентификатор, который затем передавали бы по showDocument URL.

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