m_smith Ответов: 2

Функция 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

Я вижу из здесь что существуют некоторые версии этих функций в юникоде. Может быть, вы могли бы посмотреть/попробовать?
Сейчас я иду спать, так что отвечу только через несколько часов.

2 Ответов

Рейтинг:
15

m_smith

Хорошо, спасибо за ваши усилия, ребята, я нашел решение, я должен был удалить 'http://' из URL... вот и все :) если кому-то интересно, вот код :

int main()
{
	LPCWSTR host = _T("145.239.244.171");
	LPCWSTR url = _T("api/get/customers");
	HINTERNET hIntOpen = InternetOpen(_T("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);


Рейтинг:
0

KarstenK

Вы должны научиться понимать, что ошибка-это ответ сервера по вашей просьбе. Это означает, что сервер не понимает Ваш URL-адрес. Я бы предположил, что URL-адрес недействителен или вы находитесь на неправильном порту. Почему бы вам не использовать стандартный порт 80?

Попробуйте выполнить запрос в браузере.

Совет: используйте для всех строк один и тот же макрос. => _T()
Совет 2: Используйте приложение Wireshark чтобы увидеть сетевой трафик