Как настроить http_listener для прослушивания моего IP-адреса, чтобы другие компьютеры
в сети можно отправлять запросы на сервер?
http_listener listener(L"http://localhsot:9000"); // not working
http_listener listener(L"http://0.0.0.0:9000"); // run time error
http_listener listener(L"http://*:9000"); // run time error
Я хочу использовать c ++ rest sdk в качестве сервера в моей локальной сети.
Причина по которой http_listener listener(L"http://localhsot:9000");
не работает, потому что «localhost» написано неправильно.
После того, как вы исправите опечатку, вы сможете настроить свой веб-браузер на
HTTP: // локальный: 9000 и вы получите запрос. Проверьте это с помощью функции печати.
Как уже упоминалось, не забудьте настроить поддержку запроса.
Listener.support(methods::GET, std::bind(&HandleGet, this, std::placeholders::_1));
и функция HandleGet (если запрос GET)
HandleGet(http_request request)
{
std::wcout << L"Received GET request" << std::endl;
}
Так что после того, как это было настроено, направьте ваш веб-браузер на адрес, и вы должны увидеть результат.
Кроме того, вы можете обернуть ServerInit.open().wait()
(начинает слушать) в try/catch
чтобы понять, почему это не работает.
Будучи автором, я очень рекомендую Restbed. Это проект с открытым исходным кодом, написанный на C ++ 11 с целью достижения соответствия HTTP (s) 1.0-2.0.
#include <memory>
#include <cstdlib>
#include <restbed>
using namespace std;
using namespace restbed;
void get_method_handler( const shared_ptr< Session >& session )
{
const auto request = session->get_request( );
size_t content_length = 0;
request->get_header( "Content-Length", content_length );
session->fetch( content_length, [ ]( const shared_ptr< Session >& session,
const Bytes& body )
{
fprintf( stdout, "%.*s\n", ( int ) body.size( ), body.data( ) );
session->close( OK, "Hello, World!", { { "Content-Length", "13" } } );
} );
}
int main( const int, const char** )
{
auto resource = make_shared< Resource >( );
resource->set_path( "/resource" );
resource->set_method_handler( "GET", get_method_handler );
auto settings = make_shared< Settings >( );
settings->set_port( 1984 );
settings->set_default_header( "Connection", "close" );
Service service;
service.publish( resource );
service.start( settings );
return EXIT_SUCCESS;
}
Увидеть Вот для большего количества примеров.
https://casablanca.codeplex.com/discussions/478976
Генрих Ответ
Привет я тоже столкнулся с этой проблемой.
Вы можете решить эту проблему, используя nginx в качестве прокси в Linux. Это также может добавить функцию https на ваш сервер.
Вот небольшая версия необходимого файла конфигурации nginx:
server {
listen *:80;
server_name localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:12345/;
proxy_redirect http://localhost:12345/ https://$server_name/;
}
Этот скрипт перенаправляет весь трафик на 12345. Теперь вам просто нужно слушать
http_listener listener(L"http://localhost:12345");
Не забывайте звонить в «службу поддержки».
Ура,
Генри
Я создал учетную запись на dyndns.it и установил динамическую учетную запись dns моего маршрутизатора с именем пользователя и паролем учетной записи dynds.it.
После этого сервер прослушивает этот URL:
uri_builder uri(L"http://my_account.homepc.it:80/");
auto addr = uri.to_string();
http_listener listener(addr);listener.support(methods::POST, handle_post);
try
{
listener
.open()
.then([&listener](){TRACE(L"\nstarting to listen\n"); })
.wait();
while (true);
}
catch (exception const & e)
{
wcout << e.what() << endl;
}
catch (...)
{
wcout << "error" << endl;
}
и это работает из любого места (даже если я все еще не понимаю, как управлять POST от нескольких клиентов одновременно!)