Функция Httpsendrequest (), ошибка 12005 - "URL-адрес недействителен" [решено]
Всем Привет,
Поэтому я пытаюсь написать простой код для HTTP GET и POST сессий.
Функции InternetOpen(), InternetConnect() и OpenRequest() работают или, по крайней мере, предоставляют допустимый указатель. Теперь, когда я вызываю функцию HttpSendRequest (), она продолжает возвращаться с ошибкой 12005 ("URL-адрес недействителен"). URL-адрес: http://145.239.244.171:3001/api/get/customers-да.
Спасибо за вашу помощь.
LPCWSTR host = L"http://145.239.244.171"; LPCWSTR url = L"api/get/customers"; HINTERNET hIntOpen = InternetOpen((LPCTSTR)"Mozilla/5.0 (Windows NT 6.1; rv:58.0) Gecko/20100101 Firefox/58.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); HINTERNET hIntConnect = InternetConnect(hIntOpen, host, 3001, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE, 0); HINTERNET hHttpOpenReq = HttpOpenRequest(hIntConnect, _T("GET"), url, NULL, NULL, 0, INTERNET_FLAG_RELOAD, 0); BOOL hHttpSendReq = HttpSendRequest(hHttpOpenReq, NULL, NULL, 0, 0); if (!hHttpSendReq) { DWORD ErrorNum = GetLastError(); std::cout << "Failed to open URL \nError No: " << ErrorNum; InternetCloseHandle(hIntConnect); InternetCloseHandle(hIntOpen); getchar(); return 0; }
Что я уже пробовал:
Я проверил много примеров в сети, я пытался установить различные аргументы в вызовах функций, но мое предположение все еще остается только предположением. Я также попытался указать номер порта (3001) в функции InternetConnect() вместо INTERNET_DEFAULT_HTTP_PORT.
phil.o
ИМО, номер порта должен быть частью хоста, а не url-адресом. Вы пробовали объявить хост как http://145.255.244.171:3001
и url как /api/get/customers
вместо этого?
m_smith
В этом случае я получаю ошибку 12007 ("имя сервера не может быть решено").
Rick York
Вы пробовали это сделать с портом в конце URL : /api/get/customers:3001?
m_smith
Да, тот же результат...
phil.o
Не могли бы вы попробовать
LPCWSTR host = L"145.255.244.171"; LPCWSTR url = L"/api/get/customers"; // ... HINTERNET hIntConnect = InternetConnect(hIntOpen, host, 3001, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE, 0);?
Мне кажется, что указание протокола в имени сервера является избыточным, так как этот протокол позже указывается в вызове к серверу.
InternetConnect
функция.
m_smith
Я только недавно попробовал его и забыл разместить здесь, но теперь я это сделал. К сожалению, тот же результат, ошибка 12005.
phil.o
Ну, 12005-это ERROR_INTERNET_INVALID_URL; это можно считать прогрессом :)
Можете ли вы удалить начальную косую черту из url-адреса? (url = L"api/get/customers";)
m_smith
то же самое... спасибо за ваши усилия :)
phil.o
Я вижу из здесь что существуют некоторые версии этих функций в юникоде. Может быть, вы могли бы посмотреть/попробовать?
Сейчас я иду спать, так что отвечу только через несколько часов.