@

简介

  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;
}

GeoServer-REST应用:基于Qt网络编程一键同步发布空间数据和样式至GeoServer的更多相关文章

  1. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

  2. Qt网络编程QTcpServer和QTcpSocket的理解

    前一段时间通过调试Qt源码,大致了解了Qt的事件机制.信号槽机制.毕竟能力和时间有限.有些地方理解的并不是很清楚. 开发环境:Linux((fedora 17),Qt版本(qt-everywhere- ...

  3. QT网络编程

    bool QAbstractSocket::waitForReadyRead(int msecs = 30000) bool QAbstractSocket::waitForDisconnected( ...

  4. QT 网络编程三(TCP版)

    QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...

  5. QT 网络编程二(UDP版本)

    QT的UdpSocket接收消息使用原则 第一步:new一个UdpSocket 第二步:调用UdpSocket的bind方法,同时指定端口号 第三步:使用connect将接收消息函数和UdpSocke ...

  6. QT网络编程Tcp下C/S架构的即时通信

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #in ...

  7. QT网络编程UDP下C/S架构广播通信

    QT有封装好的UDP协议的类,QUdpSocket,里面有我们想要的函数接口.感兴趣的话,可以看看. 先搞服务端吧,写一个子类,继承QDialog类,起名为UdpServer类.头文件要引用我们上边说 ...

  8. QT 网络编程

    #include "networkinformation.h" #include "ui_networkinformation.h" networkinform ...

  9. 基于python网络编程实现支持购物、转账、存取钱、定时计算利息的信用卡系统

    一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单 ...

随机推荐

  1. 关于使用学生或者教师身份免费使用JetBrains全家桶的说明

    官网操作 JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室,该公司有众多的好用的IDE,比如pycharm,webstorm,Int ...

  2. IDEA导入maven项目时,报各种包找不到--com.sunyard.encrypt.function

    IDEA错误归类 问题描述1 IDEA启动项目时,报maven引入的包找不到 暂时解决办法 问题描述2 IDEA启动项目时,报普通项目引入的包找不到 解决办法 总结: 问题1和问题2的解决办法明显冲突 ...

  3. 创建SSH密钥时使用了自定义文件名遇到的问题

    问题描述 如图,我自定义了密钥文件名字. 所以在测试连接时导致了: 问题解决 连接的时候指定自己重命名的私钥文件名就好了. ssh -T -i git_test git@github.com SSH命 ...

  4. 部分文件的MIMEType

    类型 文件拓展名 MIMEType 图片 png image/png bmp\dib image/bmp jpe\jpeg\jpg image/jpeg gif image/gif 多媒体 mp3 a ...

  5. JVM学习十五 - (复习)类加载的时机、类加载过程、类加载器

    一.类加载的时机 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段: 加载 验证 准备 解析 初始化 使用 卸载 验证.准备.解析 3 个阶段统称为连接 ...

  6. 如何使Label显示时,一行顶部居中,两行靠左显示----董鑫

    有时我们会碰到这种情况,一个要根据内容显示一行还是两行,一行时还要靠着顶部再居中,比如下面 最左边的名称,要求是靠上的,如果按照正常的方式写的话,可能一行的话就会出现居中显示了,不会顶着头部显示. 我 ...

  7. Net6 DI源码分析Part4 CallSiteFactory ServiceCallSite

    Net6 CallSiteFactory ServiceCallSite, CallSiteChain abstract class ServiceCallSite ServiceCallSite是个 ...

  8. MyBatis动态SQL和缓存

    1. 什么是动态SQL 静态SQL:静态SQL语句在程序运行前SQL语句必须是确定的,SQL语句中涉及的表的字段名必须是存在的,静态SQL的编译是在程序运行前的. 动态SQL:动态SQL语句是在程序运 ...

  9. ScaleFlux CSD 2000 在携程的应用实践

    一.业界背景与现状 近些年来,有三件事实在业界同时发生:     1.  业务的发展朝着"生产"和"使用"海量增长数据的方向演进.     2.  摩尔定律 的 ...

  10. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 0x00 摘要 0x01 回顾 0x0 ...