有人试图通过POST请求访问"api.php?action=parse&text=“页面吗?
在wiki文档上,我发现将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请求?有人想做同样的事吗?
谢谢你的建议,亚历克斯
发布于 2011-08-31 13:08:14
为什么我的API调用Wikimedia wiki只是返回一个HTML错误? 如果在POST请求中使用API调用,请确保这些请求不使用Content: 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
头,但由于某些原因,它不适用于维基百科。若要修复此问题,请在请求第一个itme之前添加以下行:
ServicePointManager.Expect100Continue = false;
https://stackoverflow.com/questions/7262991
复制相似问题