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;
}
GeoServer-REST应用:基于Qt网络编程一键同步发布空间数据和样式至GeoServer的更多相关文章
- 基于Socket网络编程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...
- Qt网络编程QTcpServer和QTcpSocket的理解
前一段时间通过调试Qt源码,大致了解了Qt的事件机制.信号槽机制.毕竟能力和时间有限.有些地方理解的并不是很清楚. 开发环境:Linux((fedora 17),Qt版本(qt-everywhere- ...
- QT网络编程
bool QAbstractSocket::waitForReadyRead(int msecs = 30000) bool QAbstractSocket::waitForDisconnected( ...
- QT 网络编程三(TCP版)
QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...
- QT 网络编程二(UDP版本)
QT的UdpSocket接收消息使用原则 第一步:new一个UdpSocket 第二步:调用UdpSocket的bind方法,同时指定端口号 第三步:使用connect将接收消息函数和UdpSocke ...
- QT网络编程Tcp下C/S架构的即时通信
先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #in ...
- QT网络编程UDP下C/S架构广播通信
QT有封装好的UDP协议的类,QUdpSocket,里面有我们想要的函数接口.感兴趣的话,可以看看. 先搞服务端吧,写一个子类,继承QDialog类,起名为UdpServer类.头文件要引用我们上边说 ...
- QT 网络编程
#include "networkinformation.h" #include "ui_networkinformation.h" networkinform ...
- 基于python网络编程实现支持购物、转账、存取钱、定时计算利息的信用卡系统
一.要求 二.思路 1.购物类buy 接收 信用卡类 的信用卡可用可用余额, 返回消费金额 2.信用卡(ATM)类 接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款 其中: 1.每种交易类型不单 ...
随机推荐
- 人口信息普查系统-JavaWeb-三
今天给大家分享前端主页面的代码,设有五个功能.涉及到增删改查,用到了超链接的跳转. <!DOCTYPE html> <html lang="en"> < ...
- Homework_3 (完整版)
划水♂️!好耶! 果然还是逃不过作业,初三刚过就要营业 审题 爬虫+算法:划水中的员工 员工 A 此刻内心一酸,大年初一加班惨绝人寰,情不自禁打开 B 站,跟着网友一起划水看番. 但是由于技术故障原 ...
- RPC调用获取参数值
本文以 RPC 获取百度登录password加密值为例: 涉及的知识点有: 1.js调试,寻找加密代码 2. 浏览器本地代码替换 3. js自执行函数 4. 插桩 5. RPC 远程调用 6. pyt ...
- LoadRunner编写socket性能测试脚本
利用LoadRunner编写socket性能测试脚本 一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socke ...
- 社交网络分析的 R 基础:(四)循环与并行
前三章中列出的大多数示例代码都很短,并没有涉及到复杂的操作.从本章开始将会把前面介绍的数据结构组合起来,构成真正的程序.大部分程序是由条件语句和循环语句控制,R 语言中的条件语句(if-else)和 ...
- CF1408G Clusterization Counting
首先,我们需要给一个连通块找到一个直观的合法判定解. 那么我们必须以一种直观的方式将边按照权值分开,这样才能直观地判定一个合法的组. 一个常见的方式是将边从小到大依次加入进来,那么在任意时刻图上存在的 ...
- 实现Nginx代理WSS协议
因为线上H5游戏需要加上SSL,不想在原来的Web 服务器和游戏服务器支持SSL,只希望 在Nginx代理集群支持SSL.整体架构如下: 从上图可以看出需要总共涉及到https/http 和wss/w ...
- nginx启动失败:Redirecting to /bin/systemctl start nginx.service Failed to start nginx.service: Unit not found.
解决方法: 是因为nginx没有有添加到系统服务,手动手动添加一个即可. 在 /etc/init.d/下创建名为nginx的启动脚本即可,内容如下: #!/bin/bash # # chkconfig ...
- IOS tableView 滑动删除与排序功能
// // ViewController.m // 0429 // // Created by apple on 15/4/29. // Copyright (c) 2015年 gense. All ...
- kubeadm/flannel/dashboard/harbor部署以及服务发布
kubeadm/flannel/dashboard/harbor部署以及服务发布 目录 kubeadm/flannel/dashboard/harbor部署以及服务发布 一.部署kubeadm 1. ...