【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决

文章目录

    • 问题描述
    • 原因分析
      • 在geoserver检查sld文本
      • 推测一、是否是geoserver-manager的API优化sld文本,导致文本内容丢失
        • 结论:geoserver-manager并没有优化文本
      • 推测二、API接口本身就有问题
        • 结论:可以确定是geoserver的内部出现问题
    • 解决方法
    • 在代码中如何解决?

解决方法直接从目录跳到最后

问题描述

使用geoserver-manager的工具在发布(创建和修改)样式时,发布的文本和传输的sld文本不一致。导致效果会变成下面这样:

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第1张图片

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第2张图片

原因分析

在geoserver检查sld文本

上面是我传输的文本

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第3张图片

下面是实际的效果

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第4张图片

经过比对,不仅xml的标签被改动,fill的属性内容也丢失了,发生了严重的bug

推测一、是否是geoserver-manager的API优化sld文本,导致文本内容丢失

第一时间就想到,可能是某种优化器将标签进行了替换和删减。直接拔源码查看

  1. Debug 到下面的位置进行检查

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第5张图片

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第6张图片

  1. 检查请求体中的数据是否被“篡改”
    • 到这里可以发现我们传入的sld文本被转成二进制了
    • idea支持以文本显示的形式展示,进入查看如下,可以确定的是,文本在发送前就是没有问题的

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第7张图片

结论:geoserver-manager并没有优化文本

推测二、API接口本身就有问题

测试方法,使用apifox或者postman去发布样式,配置如下

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第8张图片

请求头直接从工具内复制出来就行

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第9张图片

测试结果:效果和使用geoserver-manager结果一样,文本都是丢失的

结论:可以确定是geoserver的内部出现问题

解决方法

推荐阅读原文,搜了好久终于找到的关键所在 http://t.csdn.cn/DwY2z

总结原因,就是这个更新样式的接口,在后续的geoserver的版本更新中,新增了一个叫raw的参数,如果传入为false就不会覆盖原文。而恰恰官方给设置的值就是false。

验证:在apifox里添加这个参数raw=true,再请求这个接口

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第10张图片

查看效果

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第11张图片

问题解决。

在代码中如何解决?

安装原文的方法是要求自定义一个请求。自己在尝试重写的过程中发现了一个很眼熟的参数如下:

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第12张图片

不难发现,其实最新版的工具已经加入了该参数,尝试修改一下自己的发布样式方法:

加了以下两个参数

【JAVA+Geoserver】使用Geoserver的REST API发布样式,文本丢失问题,已解决_第13张图片

就可以解决问题了

如果没有参数,就把geoserver-manager升级到1.70即可

你可能感兴趣的:(GIS相关,备忘录,问题总结,GIS,java,geoserver)