Web服务调用的HTTP GET编码

0 投票
1 回答
605 浏览
提问于 2025-04-17 08:31

我有一个网络服务,是用C#来调用的。我已经成功用简单的GET请求得到了响应,比如:

http://localhost:8080/cgi-bin/py-wps.cgi?service=wps&version=1.0.0&request=describeprocess&identifier=test

但是,当我进行更复杂的请求时,响应总是出错。

http://localhost:8080/cgi-bin/py-wps.cgi?service=wps&version=1.0.0&request=execute&identifier=test&datainputs=[key1=val1,val2,val3;key2=val4;key3=val5]

我调用的网络服务是用PyWPS发布的,我使用的查询字符串在浏览器中放置是有效的。

我尝试过对所有的键值对中的值进行转义:

e.g. "datainputs=[key1="+Uri.EscapeDataString("val1"), ...

我还尝试过不同的组合

HttpUtility.UrlEncode

HttpUtility.UrlPathEncode

我遇到的错误包括:异常 exceptionCode="MissingParameterValue" locator="key1"

我不太确定自己哪里做错了,但这些网址在我的浏览器中能正常工作,所以我怀疑我在编码时出错了。我没有找到任何帖子提到单个键值对包含一系列键值对的情况(也就是说,datainputs=[key1=v1,v2,v2; ...等等)

对此问题的任何帮助都非常感谢。

编辑:这是我调用网络服务的方式

var targetUri = new Uri(uri);
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(targetUri);
        req.Method = method.ToUpper();
        req.ContentLength = 0;
        req.ContentType = "text/xml";

        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        string responseString = reader.ReadToEnd();

        reader.Close();
        responseStream.Close();
        response.Close();

        return responseString;

1 个回答

0

在"[key1=val1,val2,val3;key2=val4;key3=val5]"这个字符串里,你的'='符号需要进行双重转义。你可以先对datainputs的值进行转义,然后再对整个URL进行转义。

撰写回答