Delphi-додаток відправляє дані на сервер методом post (indy)

При розробки чергового Web-проекту постало завдання - реалізувати клієнтське ПЗ на Delphi, яке б передавало дані на сервер, використовуючи метод POST. Додаток має передавати текст і завантажувати файли на Web-сервер.

Реалізація такої відправки даних з використанням серверних мов Web розробки (наприклад, PHP) досить проста, а ось якщо необхідно написати прикладне, багато користувачів ПЗ взаємодіє з сервером, то тут вже трішки складніше. Спосіб прямого підключення до БД і по FTP до сервера з Delphi - відпадає тому це не безпечно, чи не надійно (зміна паролів, даних підключення і т.д.) і створює додаткові. проблеми з сумісністю ПО на боці клієнта. Для вирішення завдання я вирішив написати на мові PHP скрипти (серверну частину), які будуть обробляти вхідні POST запити і видавати результат назад клієнту (додаток на Delphi). Переваги такого підходу в тому, що всі підключення і обробки даних відбуваються на сервері, що набагато безпечніше прямого «конекту».

Почавши «гуглити» було видано безліч розрізненої інформації, в основному це були форуми, але все це було шматками. Одне точно визначив, що використовуватися буде Indy, а саме компонент IdHTTP з реалізованим методом POST. По суті все просто, даний метод приймає два параметри Url ресурсу і DataStream (потік даних), у відповідь же віддає результат в текстовому вигляді (так само це може бути HTML-код сторінки). Основне полягало в правильному формуванні DataStream (потоку переданих даних), але по ходу вилізли ще додаткові підводні камені, а саме російська кодування (будь вона не ладна). Ось тут-то і почалися веселощі на кілька годин блукання на просторах мережі. Загалом, вистачить балаканини, давайте перейдемо до практики і реалізації софта.

Отже, програма проста. Вона повинна відправити на сервер дані методом POST, дані містять «Тема» (рядок), «Опис» (багаторядковий текст) і графічний файл (jpg, png, gif-бінарні дані). Сервер повинен прийняти ці дані, обробити, зберегти графічний файл на сервері і повернути відповідь. Як відповідь повернемо Delphi з додатком, той же текст тільки з додаванням міток і посилання на завантажений файл. Більше нічого.

Скрипт необхідно зберегти з ім'ям «indypost1.php».

Зверніть увагу. При збереженні (через блокнот) необхідно вказати кодування «UTF-8», інакше будуть проблеми з відображенням кирилиці!

Далі відкриваємо Delphi, накидаємо наступний макет форми:

У макеті використовуються наступні компоненти: Label, Button (2шт.), Edit (2шт.), Memo (2шт.), CheckBox, OpenDialog, IdHTTP. Задайте наступним компонентам імена (властивість "Name"):

IdHTTP1 і CheckBox1 залишимо не змінюючи (набридло.)))).

Щоб випадково не «підредагувати» шлях в Edit (imgfile), виставимо йому властивість ReadOnly в True. Так само, у imgfile і chkfile властивість Enabled виставте в false. Активувати їх будемо за допомогою CheckBox тобто надамо можливість вибору - завантажувати зображення чи ні.

Для OpenDialog (PictDialog) необхідно задати фільтр (властивість Filter) наступним чином:

Delphi-додаток відправляє дані на сервер методом post (indy)

Власне візуальна підготовка закінчена! Приступаємо до кодування!

У проекті ми будемо формувати потік даних за допомогою типу йде в комплекті з Indy - TidMultiPartFormDataStream. Хоча й траплялися варіанти реалізації на TStream, але працювати з TidMultiPartFormDataStream - простіше!

Щоб цей тип став доступний нашим проектом, необхідно в Uses додати наступну бібліотеку: IdMultipartFormData.

Для CheckBox1 створіть подія OnClick (подвійним натисканням миші по об'єкту) і пропишіть в цю подію наступний код:

Тут ми активуємо об'єкти imgfileіchkfile в залежності від наявності галочки (якщо галочка стоїть, то об'єкти стають активними).

Тепер організуємо вибір зображення. Для цього створіть подію OnClick на кнопці chkfile (так само подвійним кліком по об'єкту) і пропишіть наступне:

Ця подія викличе діалог вибору зображення і якщо користувач натисне «Відкрити», то шлях на цей файл буде додано до imgfile.

І ось ми підійшли до фінальної кнопці "POST". Створіть подія OnClick для даної кнопки і додайте наступний код:

Datapost - об'єкт типу TIdMultiPartFormDataStream. Дозволяє формувати структуру POST запиту складається з полів різного типу.

Аналогічно передаються дані в поле «content».

Все, дані сформовані, залишилося їх передати скрипту на сервері і отримати відповідь:

тому TMemo не розуміє тег розриву рядків «
», Ми скористаємося функцією« StringReplace »для його заміни на зрозумілі символи розриву рядків« # 13 # 10 ».

По завершенню всього очищаємо пам'ять від об'єкта DataPost рядком:

Хоча в нашому прикладі це станеться автоматично після закінчення процедури, але все ж ...

Власне результат роботи програми на екрані:

Таким чином, ми можемо відправити на сервер як завгодно даних, файлів, обробити ці дані на сервері і повідомити додатком відповіддю, результат виконання скрипта. Це може бути навіть просто 0 або 1, що стане сигналом до подальшої реакції додатки.

Усе. Всім удачі. Сподіваюся, інформація була корисною, і Ви знайдете їй застосування.

Готовий приклад і скрипт Ви можете завантажити звідси.

Повний код модуля:

Зверніть увагу, внесені зміни в підготовку даних до відправлення та одержання відповіді, а саме здійснюється перекодування з UTF8