【问题标题】:Mediawiki action=parse with POST requestMediawiki action=使用 POST 请求解析
【发布时间】:2011-08-31 20:31:20
【问题描述】:

是否有人尝试通过 POST 请求访问“api.php?action=parse&text=”页面?

wiki documentation 上,我发现可以将wiki 文本转换为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 请求?有没有人尝试做同样的事情?

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

【问题讨论】:

    标签: c# parsing post mediawiki


    【解决方案1】:

    the API FAQ:

    为什么我在 Wikimedia wiki 上的 API 调用只返回 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";
    

    编辑:以上是查询正常工作所必需的,但这不是导致错误的原因。这就是 .Net 默认添加 Expect: 100-continue 标头的事实,由于某种原因,该标头不适用于 Wikipedia。要解决此问题,请在请求第一个项目之前添加以下行:

    ServicePointManager.Expect100Continue = false;
    

    【讨论】:

    • 首先,感谢您的快速回复!是的,我已经在 API:FAQ 上看到了……最初我的代码中就有了。无论如何,它没有帮助。你试过了吗?它对你有用吗?
    • 是的,我做到了,这似乎为我解决了问题,至少在连接到英语维基百科时。
    • 很奇怪,它对我有用,然后它没有,然后维基百科关闭了一会儿,它不再起作用了。
    • 嗯...我也在尝试使用英语维基百科。可以请你分享代码吗?
    • 酷!非常感谢!它现在正在工作......我也看到了这个问题,但首先将它放在执行请求的方法中。在第一次请求调用之前将其移至顶层,并且现在可以正常工作。
    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多