Mediawiki action =使用POST请求进行解析

时间:2011-08-31 20:31:21

标签: c# parsing post mediawiki

是否有人尝试使用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请求?有人试过这样做吗?

提前感谢任何建议, 亚历

1 个答案:

答案 0 :(得分:1)

the API FAQ

  

为什么我对维基媒体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;