
Отправка POST- и GET-запросов на Ассемблере

Отправка POST- и GET-запросов на Ассемблере
В наше время интернет-технологий профессиональные приложения должны уметь работать с удаленными сервисами. Хороший пример был в недавней статье про оптимизацию изображений. Тут есть все: отправка файла через POST-запрос и получение ответа в виде текстового JSON, а затем скачивание изображения по прямой ссылке через GET-запрос. Давайте реализуем работу с POST- и GET-запросами на Ассемблере, а чтобы польза от работы получилась не только теоретической, но и практической, это будет пример с оптимизацией графических файлов через API сервиса TinyPNG.
Для начала немного констант, о которых не знает FASM. Это не COM, так что огромных портянок с интерфейсами тут не будет.
Code (Assembler) : Убрать нумерацию
- WINHTTP_ACCESS_TYPE_NO_PROXY = 1
- WINHTTP_NO_PROXY_NAME = 0
- WINHTTP_NO_PROXY_BYPASS = 0
- WINHTTP_NO_REFERER = 0
- WINHTTP_DEFAULT_ACCEPT_TYPES = 0
- WINHTTP_FLAG_SECURE = 0x00800000
- INTERNET_DEFAULT_HTTPS_PORT = 443
- INTERNET_DEFAULT_HTTP_PORT = 80
- WINHTTP_OPTION_SECURITY_FLAGS = 31
- WINHTTP_NO_CLIENT_CERT_CONTEXT = 0
Code (Assembler) : Убрать нумерацию
- ; Открыть сессию работы с интернетом
- invoke WinHttpOpen,szUA,\
- WINHTTP_ACCESS_TYPE_NO_PROXY,\
- WINHTTP_NO_PROXY_NAME,\
- WINHTTP_NO_PROXY_BYPASS,\
- 0
- or eax,eax
- jz loc_exit
- mov [hSession],eax
- ; Соединение с удаленным сервером
- invoke WinHttpConnect,[hSession],\
- szServer,\
- INTERNET_DEFAULT_HTTPS_PORT,\
- 0
- or eax,eax
- jz loc_close_session
- mov [hConnect],eax
Code (Assembler) : Убрать нумерацию
- ; Подготовить POST-запрос для отправки файла
- invoke WinHttpOpenRequest,[hConnect],\
- szPOST,szUrl,NULL,\
- WINHTTP_NO_REFERER,\
- WINHTTP_DEFAULT_ACCEPT_TYPES,\
- WINHTTP_FLAG_SECURE
- or eax,eax
- jz loc_close_connect
- mov [hRequest],eax
- ; Настроить опции для запроса
- mov [dOptions],WINHTTP_NO_CLIENT_CERT_CONTEXT
- invoke WinHttpSetOption,[hRequest],\
- WINHTTP_OPTION_SECURITY_FLAGS,\
- dOptions,\
- 4
- or eax,eax
- jz loc_close_request
- ; Прочитать исходный файл в память
- ; [pMem] -> указатель на память с данными отправляемого файла
- ; [dFSize] -> размер отправляемых данных
- ; Отправить в запросе содержимое файла
- invoke WinHttpSendRequest,[hRequest],\
- szHeaders,-1,\
- [pMem],[dFSize],[dFSize],\
- 0
- or eax,eax
- jz loc_close_request
Code (Assembler) : Убрать нумерацию
- ; Выполнить GET-запрос
- invoke WinHttpSendRequest,[hRequest],\
- szHeaders,-1,\
- 0,0,0,\
- 0
- or eax,eax
- jz loc_close_request
Code (Assembler) : Убрать нумерацию
- ; Получить результат запроса
- invoke WinHttpReceiveResponse,[hRequest],NULL
- or eax,eax
- jz loc_close_request
- @@:
- ; Читать данные до победного результата
- invoke WinHttpReadData,[hRequest],buff,BUFF_SIZE,tmp
- ; buff -> прочитанная порция данных
- ; [tmp] -> размер прочитанных данных
- ; Все данные получены?
- cmp [tmp],BUFF_SIZE
- je @b
Code (Assembler) : Убрать нумерацию
- loc_close_request:
- ; Завершить запрос к серверу
- invoke WinHttpCloseHandle,[hRequest]
- loc_close_connect:
- ; Закрыть соединение
- invoke WinHttpCloseHandle,[hConnect]
- loc_close_session:
- ; Завершить сессию
- invoke WinHttpCloseHandle,[hSession]
В приложении пример программы с исходным текстом, которая отправляет файл с изображением на сервер TinyPNG и получает оптимизированную картинку. Если все сделано правильно, то будут созданы файлы response.dat с JSON-данными ответа и оптимизированное изображение optimized.png. ВАЖНО! Для корректной работы с сервисом TinyPNG в файле tinypng.key должна быть записана строка авторизации в формате base64("api:ваш_ключ") и в кодировке UTF-16 без BOM. Также можете просто внести ее в исходник перед компиляцией. По понятным причинам свой ключ я тут выкладывать не собираюсь.
Просмотров: 1367 | Комментариев: 2

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(12.03.2023 в 18:11):
Именно так, решил новые функции поосваивать.

morgot
(12.03.2023 в 17:26):
Спасибо! А почему winhttp, а не wininet? Для разнообразия? Я использовал его, но как-то больше привык к вининет.
Кстати, winhttp тоже доступен через СОМ.
Кстати, winhttp тоже доступен через СОМ.

Добавить комментарий
Заполните форму для добавления комментария
