Web服务调用的HTTP GET编码
我有一个网络服务,是用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进行转义。