Mediawiki action=解析POST请求

本文关键字:POST 请求 解析 action Mediawiki | 更新日期: 2023-09-27 18:07:06

是否有人尝试使用POST请求访问"api.php?action=parse&text="页面?

在wiki文档的

中,我发现可以将wiki文本转换为HTML。它与GET请求相当好,但据我所知,对文本的长度有限制,所以我试图通过POST来做到这一点。但不幸的是,没有任何成功……我得到错误信息:

远程服务器返回一个错误:(417)Expectation failed.

下面是我用于请求的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请求吗?有人试过这么做吗?

提前感谢您的任何建议,亚历克斯

Mediawiki action=解析POST请求

根据API FAQ:

为什么我的API调用维基媒体wiki只是返回一个HTML错误?

如果你在POST请求中使用API调用,确保这些请求不使用Content-Type: multipart/form-data。例如,如果您使用CURL访问API并将POST参数作为数组传递,就会发生这种情况。在Wikimedia wiki农场的前端服务器上使用的Squid代理服务器不能正确处理,因此返回一个错误。

相反,使用"value1=key1&value2=key2…"表示法将参数作为字符串传递,类似于GET请求。

在您直接访问的其他wiki上,这没有什么区别。

这意味着你需要添加以下内容:

rq.ContentType = "application/x-www-form-urlencoded";

EDIT:以上是查询正常工作所必需的,但这不是导致错误的原因。这就是. net默认添加Expect: 100-continue标头的事实,由于某种原因,这与维基百科不起作用。要解决这个问题,在为第一个条目发出请求之前添加以下行:

ServicePointManager.Expect100Continue = false;