gre*_*fab 22 qt web-services qt4
我想写一个小的HTTP服务器应用程序,它接收HTTP GET请求,处理它们并发出回复.由于应用程序的历史,我赞成使用Qt,但我能找到的是另一个(更常见的)方向:向服务器发送请求并使用QNetworkAccessManager接收回复.我需要的是一个类似socket的东西,当一个请求进来时,会生成一个对象,我可以在这个对象中选择url等,这样我就可以发出适当的回复.
在Qt框架中,我只是盲目或者不是这样吗?如果是这样,你能推荐替代品吗?
Nat*_*man 14
我刚刚发布了QHttpEngine的第一个版本,旨在填补你所描述的空白.该项目的目标是提供一组非常简单的类,提供与Qt集成的HTTP服务器.
例如,要从应用程序中的资源提供静态文件,您需要做的就是:
QFilesystemHandler handler(":/www");
QHttpServer server(&handler);
server.listen(QHostAddress::LocalHost, 8000);
Run Code Online (Sandbox Code Playgroud)
您还可以创建一个派生类,该类QObject
将其插槽公开为HTTP API中的端点.例如:
class ApiHandler : public QObjectHandler
{
Q_OBJECT
private slots:
QVariantMap doSomething(const QVariantMap ¶ms) {
// do something with the parameters and return a response
}
};
Run Code Online (Sandbox Code Playgroud)
然后,用户可以/doSomething
使用编码为JSON的参数发送POST请求,并接收插槽生成的响应.
整个库都有完整的文档,并附带一个相当详尽的测试套件.它是跨平台的,在Linux,Windows和Mac OS X上经过官方测试和支持.至少有一个主要的开源应用程序使用QHttpEngine,NitroShare.
小智 7
这是一个非常简单的HTTP Web服务器,它将更新每秒的秒数,因为在Web浏览器上建立了连接.它还显示Web浏览器在屏幕上发送的数据.程序设置为使用端口8080,例如127.0.0.1:8080
#-------------- Project file webServer3.pro -------
QT += core
QT += network
QT -= gui
TARGET = webServer3
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
HEADERS += \
myhttpserver.h
/*------------------header file myhttpserver.h --------------*/
#ifndef MYHTTPSERVER
#define MYHTTPSERVER
#include <QCoreApplication>
#include <QNetworkInterface>
#include <iostream>
#include <QObject>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>
class myHTTPserver : public QObject
{
Q_OBJECT
public:
explicit myHTTPserver(QObject *parent = 0);
~myHTTPserver();
QTcpSocket *socket ;
public slots:
void myConnection();
private:
qint64 bytesAvailable() const;
QTcpServer *server;
signals:
};
/*------------------------main.cpp -------------------------*/
#include "myhttpserver.h"
using namespace std;
void delayms( int millisecondsToWait );
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
myHTTPserver server;
return a.exec();
}
myHTTPserver::myHTTPserver(QObject *parent) : QObject(parent)
{
server = new QTcpServer(this);
// waiting for the web brower to make contact,this will emit signal
connect(server, SIGNAL(newConnection()),this, SLOT(myConnection()));
if(!server->listen(QHostAddress::Any,8080))cout<< "\nWeb server could not start";
else cout<<"\nWeb server is waiting for a connection on port 8080";
}
void myHTTPserver::myConnection()
{
static qint16 count; //count number to be displayed on web browser
socket = server->nextPendingConnection();
while(!(socket->waitForReadyRead(100))); //waiting for data to be read from web browser
char webBrowerRXData[1000];
int sv=socket->read(webBrowerRXData,1000);
cout<<"\nreading web browser data=\n";
for(int i=0;i<sv;i++)cout<<webBrowerRXData[i];
cout<<"\n";
socket->write("HTTP/1.1 200 OK\r\n"); // \r needs to be before \n
socket->write("Content-Type: text/html\r\n");
socket->write("Connection: close\r\n");
socket->write("Refresh: 1\r\n\r\n"); //refreshes web browser every second. Require two \r\n.
socket->write("<!DOCTYPE html>\r\n");
socket->write("<html><body>Number of seconds since connected.. ");
QByteArray str;
str.setNum(count++); //convert int to string
socket->write(str);
socket->write(" </body>\n</html>\n");
socket->flush();
connect(socket, SIGNAL(disconnected()),socket, SLOT(deleteLater()));
socket->disconnectFromHost();
}
myHTTPserver::~myHTTPserver()
{
socket->close();
}
Run Code Online (Sandbox Code Playgroud)
QttpServer = Qt + libuv + REST =您的API服务器
对于需要处理大量并发连接,请求和你有什么的Qt API服务器 ......我们有libuv库.
虽然libuv是为NodeJS构建的,但我们在Qt-land中的粉丝仍然可以从epolls和kqueues中获益,而不是默认的select方法.
有关github的更多信息,请访问https://github.com/supamii/QttpServer