getMoreTime

View Post

GeoServer-REST应用:基于Qt网络编程一键同步发布空间数据和样式至GeoServer

@

简介

  GeoServer 提供 RESTful 接口, 通过使用REST 接口的简单 HTTP 调用,客户端可以无需使用 Web 管理接口来配置 GeoServer并检索有关资源的信息进行配置更改。对资源的操作基于 HTTP 标准:GET 读取;以及 PUT、POST 和 DELETE 来写入更改; 每个URL指向一个资源。
  REST (REpresentational State Transfer)对命名资源采用一组固定的操作,其中每个资源的表示是相同的,可以检索(读取)XML 格式的数据,也可以将数据以类似的 XML 格式发送回服务器,以便对系统进行设置(写入)更改。
  链接: GeoServer-REST API.

配置

  IDE:Qt Creator 5.0.2
  C++框架:Qt 5.12
  Web服务器:tomcat 8.5.70
  GeoServer版本:2.19.2

步骤

  1.引入Qt网络模块

  pro文件中添加QT += network;并在头文件中引入

   #include <QNetworkAccessManager> //网络管理,发送请求,创建响应
   #include <QNetworkRequest>  //网络请求
   #include <QNetworkReply>  //网络响应

  2.创建网络管理、网络响应、网络请求

    //创建网络管理器
    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);

    //创建网络响应
    QNetworkReply *reply;
    
    //创建网络请求对象,并设置请求内容
    QNetworkRequest request;
    //请求头,媒体类型、编码
    request.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/xml;charset=utf-8"));
    request.setRawHeader("Authorization",getAuthorizationInfo().toUtf8());//身份验证

  由于访问GeoServer需要进行身份验证,因此在请求头中还需要设置身份验证信息。

//获取身份验证信息并转换格式,用户名:admin,密码:geoserver
QString MainWindow::getAuthorizationInfo()
{
    QString userPwd = QString("%1:%2").arg("admin").arg("geoserver");
    QString userPwdBase64 = userPwd.toUtf8().toBase64();
    QString AuthorizationInfo = QString("Basic %1").arg(userPwdBase64);
    return AuthorizationInfo;
}

  3.创建工作空间

    //url设为workspaces端点
    request.setUrl(QUrl("http://localhost:8080/geoserver/rest/workspaces/"));
     //请求发送的数据(xml格式)
    data ="<workspace><name>RestTest</name></workspace>";
    //发送请求创建响应
    reply = accessManager->post(request,data.toUtf8());
    //响应置空
    reply=Q_NULLPTR;

  4.创建数据存储并上传数据

    //url设为datastores端点,工作空间名需已经创建
    request.setUrl(QUrl("http://localhost:8080/geoserver/rest/workspaces/RestTest/datastores"));
    //数据源为本地数据
    data ="<dataStore><name>test</name><connectionParameters><url>file://F:/GeoServerDatabase/data/test.shp</url></connectionParameters></dataStore>";
    //数据源为PostGIS
    //data ="<dataStore><name>test</name><connectionParameters><host>localhost</host><port>5432</port><database>TestGIS</database><user>postgres</user><passwd>123456</passwd><dbtype>postgis</dbtype></connectionParameters></dataStore>";
    reply = accessManager->post(request,data.toUtf8());
    reply=Q_NULLPTR;

  5.上传样式文件

  //url设为styles端点
    request.setUrl(QUrl("http://localhost:8080/geoserver/rest/styles"));
    //样式名和样式文件名,样式文件需在geoserver的styles文件夹下,例如E:\apache-tomcat-8.5.70\webapps\geoserver\data\styles
    data = "<style><name>teststyle</name><filename>teststyle.sld</filename></style>";
    reply = accessManager->post(request,data.toUtf8());
    reply=Q_NULLPTR;

  6.图层发布

    //url设为featuretypes端点
    request.setUrl(QUrl("http://localhost:8080/geoserver/rest/workspaces/RestTest/datastores/test/featuretypes"));
    data = "<featureType><name>test</name><srs>EPSG:4326</srs></featureType>";
    reply = accessManager->post(request,data.toUtf8());
    reply=Q_NULLPTR;

  6.图层和样式绑定

    //url设为layers端点,图层为(工作空间%3A图层名)
    request.setUrl(QUrl("http://localhost:8080/geoserver/rest/layers/RestTest%3Atest"));
    data = "<layer><name>test</name><defaultStyle><name>teststyle</name></defaultStyle></layer>";
    reply = accessManager->post(request,data.toUtf8());

  7.网络响应结束

    //绑定响应结束信号与槽函数
    connect(reply,SIGNAL(finished()),this,SLOT(replyFinished()));
void MainWindow::replyFinished()
{
    //打印响应返回的信息
    QTextCodec *codec = QTextCodec::codecForName("utf8");        
    QString backInfo = codec->toUnicode(reply->readAll());
    qDebug()<<backInfo;
    //删除网络响应并置空
    reply->deleteLater();
    reply=Q_NULLPTR;
}

相关文章: