如何正确地通过POST请求获取geoserver WFS?

6
我有一个geoserver实例,包含我们的数据。通过GET请求可以正常工作并返回预期结果。但不幸的是,使用POST无法正常工作。
具体而言,这是使用GET请求的能力请求,返回有效的GetCapabilities响应:
http://myserver:8080/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities

我用wget测试了这个,所以命令看起来是这样的:
wget -O wfs 'http://myserver:8080/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities'

现在我尝试使用POST请求Capabilities。我创建了一个名为request的请求文件,其内容如下:
<GetCapabilities
 service="WFS"
 xmlns="http://www.opengis.net/wfs"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.opengis.net/wfs
 http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"/>

我使用以下wget命令来运行它与Geoserver:
wget -O wfs --post-file=request 'http://myserver:8080/geoserver/wfs'

但现在我遇到了OWS异常:

<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0.0" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://moa:8080/geoserver/schemas/ows/1.1.0/owsAll.xsd">
  <ows:Exception exceptionCode="MissingParameterValue" locator="request">
    <ows:ExceptionText>Could not determine geoserver request from http request org.geoserver.platform.AdvancedDispatchFilter$AdvancedDispatchHttpRequest@1e5c2cc</ows:ExceptionText>
  </ows:Exception>
</ows:ExceptionReport>

这看起来像是没有发送POST-body或者被忽略了。我在这里做错了什么?
编辑:好的,我解决了问题。问题在于Geoserver期望在发布XML文件时有Content-Type头。因此,正确的请求应该像下面这样:
wget -O wfs --header='Content-Type: text/xml' --post-file=request.xml 'http://myserver:8080/geoserver/wfs'

这将返回预期的结果。

1个回答

4
我尝试调查您的情况,但我没有服务器,所以我使用了http://demo.opengeo.org/geoserver/web/ GET测试:http://demo.opengeo.org/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities 我得到了像您一样的完整响应。 POST测试: 我使用了http://www.hurl.it/,因为我在Windows计算机上。使用以下参数:
URL:http://demo.opengeo.org/geoserver/wfs 参数:添加body>与您的相同:
<GetCapabilities service="WFS" xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"/>
我得到了与GET版本相同的响应。
您能否尝试使用此演示服务器进行相同的测试?
更新: 在一些评论交流之后,原帖发现了解决方案。POST调用缺少强制性的Content-Type-Header信息。

这不是一个答案,为什么不是评论呢? - Mnementh
那么这个wget调用有什么问题呢?我在编程时遇到了这个问题,使用wget是因为它是一个标准工具,因此错误可能出现在我的一些方面(请求、URL、wget参数、Geoserver配置等)。而且我的问题已经在原帖中提出:我做错了什么。你复制了这个问题。 - Mnementh
请不要生气,我正在尝试解决这个问题。正如我所说,我遇到了编程方面的问题,并且一直在缩小和限定问题范围,因此使用了wget。我可以通过hurl来复现它,所以问题就是hurl做了什么不同的事情。也许由于它由浏览器执行,这会添加一些标题,但是会添加哪些标题呢?无论hurl做了什么不同的事情(例如添加额外的头信息),它都是最终决定因素,因为无论它做了什么,都可以将其添加到wget和我的程序中。但是我需要知道它到底做了什么。 - Mnementh
那么下一步,您可以尝试查找一个基本的POST演示服务(不是geoserver),并尝试进行基本调用,使其在您的wget工具和hurl之间具有相同的行为,然后您可能能够看到发送的数据差异? - Nicolas R
我使用curl更新了我的答案,因为wget似乎不是正确的工具(请参见先前的评论)。 - Nicolas R
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接