是否有人尝试使用POST请求访问“api.php?action = parse& text =”页面?
wiki documentation上的我发现可以将维基文本转换为HTML。它对GET请求工作得很好,但是我可以理解它对文本的长度有限制,所以我试图通过POST来做到这一点。但遗憾的是没有任何成功......我收到错误消息:
远程服务器返回错误:(417)期望失败。
这是我用于请求的C#代码:
StringBuilder postData = new StringBuilder();
foreach(var param in parameters)
{
if (postData.Length > 0)
postData.Append("&");
postData.AppendFormat("{0}={1}", param.Key, EncodeUrl(param.Value));
}
byte[] data = Encoding.UTF8.GetBytes(postData.ToString());
HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(wiki.WikiURI + "/" + pgname);
rq.UserAgent = "Test Wiki Access" + Utils.Version.ToString();
rq.ContentType = "application/x-www-form-urlencoded";
rq.Method = "POST";
rq.ContentLength = data.Length;
Stream stream = rq.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Flush();
stream.Close();
string res = new StreamReader(rq.GetResponse().GetResponseStream(), Encoding.UTF8)
.ReadToEnd();
只是想知道我的代码中的问题或该页面根本不支持POST请求?有人试过这样做吗?
提前感谢任何建议, 亚历
答案 0 :(得分:1)
为什么我对维基媒体wiki的API调用只返回HTML错误?
如果您对POST请求使用API调用,请确保这些请求不使用 Content-Type:multipart / form-data 。例如,如果您使用CURL访问API并将POST参数作为数组传递,则会发生这种情况。在维基媒体wiki服务器场的前端服务器上使用的Squid代理服务器无法正确处理,因此会返回错误。
相反,使用“value1 = key1& value2 = key2 ...”表示法将参数作为字符串传递,类似于GET请求。
在您直接访问的其他wiki上,它没有什么区别。
这意味着您需要添加以下内容:
rq.ContentType = "application/x-www-form-urlencoded";
编辑:以上是查询正常工作所必需的,但不是导致错误的原因。这就是.Net默认添加Expect: 100-continue
标头的事实,由于某种原因,它不适用于维基百科。要解决此问题,请在发出第一个itme请求之前添加以下行:
ServicePointManager.Expect100Continue = false;