如何配置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作为服务器。
答案 0 :(得分:4)
http_listener listener(L"http://localhsot:9000");
不起作用是因为“localhost”拼写错误。
一旦你纠正了拼写错误,你应该能够将你的网络浏览器指向 http://localhost: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;
}
因此,在设置完成后,将Web浏览器指向该地址,您应该看到输出。
此外,您可以将ServerInit.open().wait()
(开始聆听)包裹在try/catch
中,看看它为什么不起作用。
答案 1 :(得分:2)
作为作者,我强烈推荐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;
}
有关更多示例,请参阅here。
答案 2 :(得分:0)
https://casablanca.codeplex.com/discussions/478976
HENRYTM回答
您好我也遇到过这个问题。 你可以通过在linux上使用nginx作为代理来解决这个问题。这也可以将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");
不要忘记“支持”电话。 干杯, 亨利
答案 3 :(得分:0)
我在dyndns.it上创建了一个帐户,并使用dynds.it帐户的用户名和密码设置我的路由器动态DNS帐户。 在该服务器侦听该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!)