Mediawiki action = анализ с запросом POST - PullRequest
1 голос
/ 01 сентября 2011

Кто-нибудь пытался сделать доступ к странице "api.php? Action = parse & text =" с помощью запроса POST?

в документации по вики Я обнаружил, что можно конвертировать вики-текст в 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-запросы? Кто-нибудь пытался сделать то же самое?

Заранее спасибо за любые предложения, Alex

1 Ответ

1 голос
/ 01 сентября 2011

За FAQ по API :

Почему мой вызов API на вики-сайте Викимедиа просто возвращает ошибку HTML?

Если вы используете вызовы API с запросами POST, убедитесь, что эти запросы не используют Content-Type: multipart / form-data . Это происходит, например, если вы используете CURL для доступа к API и передаете параметры POST в виде массива. Прокси-серверы Squid, используемые на внешних серверах в вики-ферме Wikimedia, не обрабатывают это правильно, поэтому возвращается ошибка.

Вместо этого используйте нотацию «value1 = key1 & value2 = key2 ...» для передачи параметров в виде строки, аналогично запросам GET.

В других вики, к которым вы обращаетесь напрямую, это не имеет значения.

Это означает, что вам нужно добавить следующее:

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

РЕДАКТИРОВАТЬ: Выше, требуется для правильной работы запроса, но это не то, что вызывает ошибку. Это тот факт, что .Net по умолчанию добавляет заголовок Expect: 100-continue, который по какой-то причине не работает с Википедией. Чтобы исправить это, добавьте следующую строку, прежде чем отправлять запрос на первый itme:

ServicePointManager.Expect100Continue = false;
...