Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
#1

POST запрос в WinInet. Данные не добавляются в БД - C++

16.02.2014, 21:41. Просмотров 890. Ответов 12
Метки нет (Все метки)

Осваиваю WinInet и пытаюсь отправить POST запрос на сервер. Как ни пытался, данные из str0pt всячески отказываются добавляться в БД. Подскажите, пожалуйста, где ошибка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet")
 
#include <stdlib.h>
#include <fstream>
#include <tchar.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    HINTERNET hInternet =
        ::InternetOpen(
            TEXT("WinInet Test"),
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,NULL,
            0);
 
    if (hInternet != NULL) {
        // открываем HTTP сессию
        HINTERNET hConnect = 
            ::InternetConnect(
                hInternet,
                TEXT("h49778.srv8.test-hf.ru"),
                INTERNET_DEFAULT_HTTP_PORT,
                NULL,NULL,
                INTERNET_SERVICE_HTTP,
                0,
                1u);
 
        if (hConnect != NULL) {
            // открываем запрос
            HINTERNET hRequest = 
                ::HttpOpenRequest(
                    hConnect,
                    TEXT("POST"),
                    TEXT("/reg.php"),
                    NULL,
                    NULL,
                    0,
                    INTERNET_FLAG_KEEP_CONNECTION,
                    1);
 
            if (hRequest != NULL) {
                
                char strOpt[] = "login=testadd&password=testadd";
                
                BOOL bSend; string strAdd;
             
                // Формируем заголовок
                strAdd = "Accept: */*";
                bSend = ::HttpAddRequestHeaders(hRequest, LPCWSTR(strAdd.c_str()), strAdd.length(), HTTP_ADDREQ_FLAG_ADD);
                strAdd = "Content-Type: application/x-www-form-urlencoded";
                bSend = ::HttpAddRequestHeaders(hRequest, LPCWSTR(strAdd.c_str()), strAdd.length(), HTTP_ADDREQ_FLAG_ADD);
 
                // посылаем запрос
                bSend = ::HttpSendRequest(hRequest, NULL, 0, (void*)strOpt, strlen(strOpt));
 
               //===========================================================================
                printf( "Request closing\n" );
                // закрываем запрос
                ::InternetCloseHandle(hRequest);
            }
            // закрываем сессию
            ::InternetCloseHandle(hConnect);
        }
        // закрываем WinInet
        ::InternetCloseHandle(hInternet);
    }
 
    return 0;
}
Добавлено через 1 час 22 минуты
Ап, что ли...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
16.02.2014, 22:47     POST запрос в WinInet. Данные не добавляются в БД #2
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
strAdd = "Content-Type: application/x-www-form-urlencoded"; bSend = ::HttpAddRequestHeaders(hRequest, LPCWSTR(strAdd.c_str()), strAdd.length(), HTTP_ADDREQ_FLAG_ADD);
strAdd - это строка char-ов. Т.е. строка, где один байт на символ.
А HttpAddRequestHeaders, судя по коду, требует LPCWSTR, что есть
Long Pointer to Const Wide-char STRint - указатель на константную wchar-строку.
Обратите внимание: wchar-строку (2 байта на символ), а не char.
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
16.02.2014, 23:00  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #3
То есть вместо string strAdd мне нужно сделать массив типа wchar? Или как?
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
16.02.2014, 23:14     POST запрос в WinInet. Данные не добавляются в БД #4
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
То есть вместо string strAdd мне нужно сделать массив типа wchar?
Просто используйте std::wstring.
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
16.02.2014, 23:24  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #5
Можете, пожалуйста, привести пример его использования? Объявление переменной и присвоение ей текстового значения.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
16.02.2014, 23:27     POST запрос в WinInet. Данные не добавляются в БД #6
std::wstring Name = L"John";
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
16.02.2014, 23:29  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #7
В таком случае выдаёт ошибку и присваивается только TEXT("...");
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
16.02.2014, 23:53     POST запрос в WinInet. Данные не добавляются в БД #8
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
В таком случае выдаёт ошибку
http://codepad.org/RSOWG4HE
C++
1
2
3
4
5
6
7
#include <string>
 
int main()
{
    std::wstring Name = L"John";
    return 0;
}
No errors or program output.
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
и присваивается только TEXT("...");
Какую ошибку ? Кому/чему присваивается ?
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
17.02.2014, 00:11  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #9
Не заметил L изначально. Теперь ошибка исчезла, но запрос-таки в нужном виде до сервера не добирается и в таблицу данные не заносятся..
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
17.02.2014, 00:22     POST запрос в WinInet. Данные не добавляются в БД #10
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
Теперь ошибка исчезла, но запрос-таки в нужном виде до сервера не добирается и в таблицу данные не заносятся.
Значит, берем в руки сниффер, смотрим лог запросов-ответов, ищем ошибки.
Если есть образец запроса-ответа, играем в игру под названием "создай свой
запрос и найди 5 отличий". До победного конца. Можно поднять локальный
сервер на локалхосте и отправлять запросы него. Это помогает быстрее
локализовать проблемное место и упрощает тестирование/отладку.

По HTTP-кодам ответа сервера тоже, кстати, многое можно узнать...
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
17.02.2014, 00:55  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #11
А ведь-таки помогло! Спасибо большое! Полный запрос, пойманный сниффером и сработавший в программе, выглядит так: "login=testadd&password=testadd&submit=%C7%E0%F0%E5%E3%E8%F1%F2%F0%E8%F0%EE%E2%E0%F2%FC%F1%"
серверу зачем-то понадобилось знать, что данные были отправлены именно кнопкой "зарегистрироваться"
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
17.02.2014, 01:01     POST запрос в WinInet. Данные не добавляются в БД #12
Цитата Сообщение от Werewolf_RU Посмотреть сообщение
полный запрос, пойманный сниффером и сработавший в программе, выглядит так: "login=testadd&password=testadd&submit=%C7%E0%F0%E5%E3%E8%F1 %F2%F0%E8%F0%EE%E2%E0%F2%FC%F1%"
Что это такое идёт после submit?
Это называется URL Encoding или Percent-Encoding.
Данные, передаваемые в запросах "application/x-www-form-urlencoded" (и не только),
должны быть закодированы с помощью URL Encoding.

Описано здесь, например:

HTML URL Encoding Reference
http://www.w3schools.com/TAGs/ref_urlencode.asp

Percent-encoding (Wikipedia)
http://en.wikipedia.org/wiki/Percent-encoding

Ну и первоисточник, конечно же:

Forms in HTML documents (см. раздел Form content types)
http://www.w3.org/TR/html401/interact/forms.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2014, 01:09     POST запрос в WinInet. Данные не добавляются в БД
Еще ссылки по теме:
C++ Не добавляются символы в строку string
C++ Не добавляются элементы в динамический массив
C++ Добавляются лишние символы при выводе данных в поток
C++ При чтение из файла в начало строки добавляются лишние символы
C++ однонаправленный список: элементы добавляются и удаляются с начала, просматриваются с конца списка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Werewolf_RU
7 / 7 / 3
Регистрация: 03.02.2014
Сообщений: 195
Завершенные тесты: 1
17.02.2014, 01:09  [ТС]     POST запрос в WinInet. Данные не добавляются в БД #13
Ещё раз спасибо)
Yandex
Объявления
17.02.2014, 01:09     POST запрос в WinInet. Данные не добавляются в БД
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru