Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java <-> php


Автор: Shklyar 14.4.2008, 15:28
Добрый день.
Вот захотел сделать оконную программку, в целях обучения (а возможно она будет мне и полезной), для загрузки данных на сайт (а вернее в MySQL).
Где мой сайтик поддержки JSP нет (php + mysql). Возможно-ли сделать так: программка на моем компьютере создает sql query и передает его php скрипту на сайте, который работает с MySQL. (работать с MySQL могут, как я понимаю, только программы с сервера?)

Так можно сделать? Если да - подскажите как наладить контакт Java (на моем компе) <-> php (на сервере). Если можно - на простеньком примере.

Автор: LSD 14.4.2008, 15:34
Да можно. Берешь http://hc.apache.org/httpclient-3.x/, передаешь POST-ом серверу запрос, PHP его получает и выполняет в MySQL-е. Результат выполнения возвращает твое программе.

P.S. И стоит подумать о безопасности, а то выполнить любой запрос на сервере, это очень нехило.

Автор: Goganchic 14.4.2008, 15:39
Согласен с LSD, может быть стоит прикрутить какую-нибудь авторизацию, а еще лучше пустить траф по HTTPS

Автор: Shklyar 14.4.2008, 16:20
Буду изучать.

А пока, если можно, проиллюстрируете работу HTTP клиента на супер простом примере.

Автор: LSD 14.4.2008, 16:27
http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/.

Автор: v2v 14.4.2008, 16:34
Код

    try {
        URL url = new URL("http://myserver.com/executesql?sql=select name from my_db.my_table&login=administrator&password=administratorpassword");
        URLConnection conn = url.openConnection();
        }
    } catch (Exception e) { e.printStackTrace();  }

Автор: Shklyar 16.4.2008, 11:32
Код

POST http://www.HTTPClient.java HTTP/1.1
Host: HTTPClient.java
User-Agent: HTTPClient

param1=1

Это правильный HTTP запрос? Почему-то методом GET получается передать параметр, а методом POST - нет.

Автор: LSD 16.4.2008, 11:46
Код покажи.

Автор: Shklyar 16.4.2008, 12:09
Код

            byte buf[] = new byte[64*1024];
            int r;
            
            String header = new String(jTextArea1.getText());

            // String host = extract(header, "Host:", "\n"); ???
            String host = "HTTPClient.java";
            if(host == null)
            {
                jTextArea2.setText("invalid request:\n"+header);
                return;
            }
            
            int port = host.indexOf(":", 0);
            if(port < 0) port = 80;
            else
            {
                port = Integer.parseInt(host.substring(port+1));
                host = host.substring(0, port);
            }
            
            Socket s = new Socket(host, port);
            
            s.getOutputStream().write(header.getBytes());
            
            InputStream is = s.getInputStream();
            
            r = is.read(buf);
            jTextArea2.setText(new String(buf, 0, r));
        } catch(Exception e) {
            e.printStackTrace();
        }

Автор: LSD 16.4.2008, 12:15
Ужас! Во первых что за хост такой HTTPClient.java smile Во вторых, зачем надо руками формировать HTTP запрос, есть же готовые классы?

Автор: Shklyar 16.4.2008, 15:32
Код

        try {
            URL s = new URL("http://test.net/");
            URLConnection sc = s.openConnection();
            sc.setDoOutput(true);
            PrintWriter out = new PrintWriter(sc.getOutputStream());
            out.print(jTextArea1.getText());
            out.close();
            
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(sc.getInputStream()));
            String inputLine;
            jTextArea2.setText("");
            while ((inputLine = in.readLine()) != null)
                jTextArea2.setText(jTextArea2.getText()+inputLine+"\n");
            in.close();
        } catch(Exception e) {
            e.printStackTrace();
        }

Автор: v2v 16.4.2008, 15:53
так гораздо лучше, хотя было бы не плохо отделить в разные методы / классы работу с графическими элементами (jTextArea2) и с самим протоколом http .

Автор: Shklyar 16.4.2008, 16:06
тож подумал, что логично вынести это в конструктор отдельного статического(?) класса?

Автор: v2v 16.4.2008, 16:23
а что такое "статический класс" : я такого не знаю  smile 

Автор: Shklyar 17.4.2008, 11:40
А как называют класс, когда нельзя создать объект этого класса?

Автор: LSD 17.4.2008, 13:11
Цитата(Shklyar @  17.4.2008,  12:40 Найти цитируемый пост)
А как называют класс, когда нельзя создать объект этого класса?

Абстрактный.

Автор: Shklyar 21.4.2008, 14:20
Подскажите еще:
Как передать методом post массив?

Автор: LSD 21.4.2008, 14:26
Цитата(Shklyar @  21.4.2008,  15:20 Найти цитируемый пост)
Как передать методом post массив?

Как хочешь. Никаких стандартов на это нет. Можешь передать в виде строки, где значения разделены точкой с запятой, можешь передать через параметры: array-myarray-0 - первый элемент массива, array-myarray-1 - второй элемент массива и т.д.

Автор: Shklyar 21.4.2008, 16:14
А если большой будет массив не возникнет проблем?
Что такое serialize? Можно-ли упаковать массив в String myArray = "абракадабра"

Добавлено через 55 секунд
А потом прочесть это в php?

Автор: LSD 21.4.2008, 16:54
Цитата(Shklyar @  21.4.2008,  17:14 Найти цитируемый пост)
Что такое serialize?

http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
Стандартная сериализация в Java такова, что прочесть данные не из Java - проблематично.


Цитата(Shklyar @  21.4.2008,  17:14 Найти цитируемый пост)
Можно-ли упаковать массив в String myArray = "абракадабра"

Цитата(LSD @  21.4.2008,  15:26 Найти цитируемый пост)
Можешь передать в виде строки, где значения разделены точкой с запятой

Автор: Shklyar 21.4.2008, 17:04
Боюсь, что в значении могут присутствовать все символы..

Автор: LSD 21.4.2008, 18:20
Цитата(Shklyar @  21.4.2008,  18:04 Найти цитируемый пост)
Боюсь, что в значении могут присутствовать все символы.. 

Тогда экранируй их.

Автор: Shklyar 22.4.2008, 14:30
Цитата(LSD @  21.4.2008,  18:20 Найти цитируемый пост)
Тогда экранируй их. 

Посоветуйте как.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)