WebRequest для подключения к Wikipedia API

Это может быть жалкая простая проблема, но я не могу отформатировать веб-запрос / ответ публикации для получения данных из API Википедии. Я разместил свой код ниже, если кто-нибудь может помочь мне разобраться в моей проблеме.

    string pgTitle = txtPageTitle.Text;

    Uri address = new Uri("http://en.wikipedia.org/w/api.php");

    HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    string action = "query";
    string query = pgTitle;

    StringBuilder data = new StringBuilder();
    data.Append("action=" + HttpUtility.UrlEncode(action));
    data.Append("&query=" + HttpUtility.UrlEncode(query));

    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());

    request.ContentLength = byteData.Length;

    using (Stream postStream = request.GetRequestStream())
    {
        postStream.Write(byteData, 0, byteData.Length);
    }

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        // Get the response stream.
        StreamReader reader = new StreamReader(response.GetResponseStream());

        divWikiData.InnerText = reader.ReadToEnd();
    }

person NickJ    schedule 21.04.2009    source источник
comment
На первый взгляд ваш код выглядит хорошо. В чем конкретно проявляется проблема? Что за исключение?   -  person Tommi Forsström    schedule 21.04.2009
comment
Исключение: удаленный сервер возвратил ошибку: (417) Ожидание не выполнено.   -  person NickJ    schedule 21.04.2009
comment
@NickJ: Попробуйте мой код ниже. Это сработало.   -  person Keltex    schedule 21.04.2009
comment
Вам нужно добавить System.Net.ServicePointManager.Expect100Continue = false; См. stackoverflow.com/questions/566437/   -  person Keltex    schedule 21.04.2009
comment
Я хотел бы дать вам обоим несколько очков репутации за вашу помощь. Но мне пока не хватает. В любом случае спасибо, ребята. Я снова буду посещать Стек. Keltex - может быть, вы могли бы просто отредактировать свой пост с ответом, чтобы другие люди могли видеть ответ. приветствует Ник   -  person NickJ    schedule 21.04.2009


Ответы (3)


Возможно, вы захотите сначала попробовать GET-запрос, потому что это немного проще (вам нужно будет выполнить POST только для входа в Википедию). Например, попробуйте смоделировать этот запрос:

http://en.wikipedia.org/w/api.php?action=query&prop=images&titles=Main%20Page

Вот код:

HttpWebRequest myRequest =
  (HttpWebRequest)WebRequest.Create("http://en.wikipedia.org/w/api.php?action=query&prop=images&titles=Main%20Page");
using (HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse())
{
    string ResponseText;
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        ResponseText = reader.ReadToEnd();
    }
}

Изменить: Другая проблема, с которой он столкнулся с запросом POST, заключалась в The exception is : The remote server returned an error: (417) Expectation failed.. Ее можно решить, установив:

System.Net.ServicePointManager.Expect100Continue = false;

(Это из: Ошибка возврата HTTP POST: 417 ожидание Ошибка.)

person Keltex    schedule 21.04.2009
comment
Спасибо, Keltex, я могу легко заставить Get работать. используя: WebRequest req = WebRequest.Create (адрес +? + данные) как WebRequest; используя (WebResponse resp = req.GetResponse () как WebResponse) {StreamReader readme = new StreamReader (соответственно GetResponseStream ()); divWikiData.InnerText = readme.ReadToEnd (); } Этот запрос на публикацию по-прежнему не дает мне покоя - и мне нужна публикация для некоторых действий, которые позволяет api. - person NickJ; 21.04.2009
comment
Ник, не могли бы вы сообщить нам, что за проблема отображается в вашем POST-запросе? Какое у вас исключение? Как себя ведет? - person Tommi Forsström; 21.04.2009
comment
Исключение: Исключение: удаленный сервер возвратил ошибку: (417) Ожидание не выполнено. - person NickJ; 21.04.2009
comment
Keltex еще раз благодарит за код запроса Get. Мне действительно нужно некоторое представление о том, как использовать запрос Get, так как в конечном итоге я хотел бы попробовать войти в систему и отредактировать страницы. - person NickJ; 21.04.2009
comment
Вам нужно добавить System.Net.ServicePointManager.Expect100Continue = false; См. stackoverflow.com/questions/566437/ - person Keltex; 21.04.2009
comment
Я обнаружил, что вы должны установить свойство HttpWebRequest.UserAgent [^] и идентифицировать своего клиента при вызове API. В противном случае вы получите сообщение об ошибке 403. Итак, я бы добавил myRequest.UserAgent = "MyWikiClient\1.0"; или что-то подобное в код Keltex. - person lazo; 16.04.2011

В настоящее время я нахожусь на завершающей стадии реализации C # MediaWiki API, который позволяет легко создавать сценарии для большинства действий по просмотру и редактированию MediaWiki.

Главный API находится здесь: http://o2platform.googlecode.com/svn/trunk/O2%20-%20All%20Active%20Projects/O2_XRules_Database/_Rules/APIs/OwaspAPI.cs и вот пример API в использовать:

var wiki = new O2MediaWikiAPI("http://www.o2platform.com/api.php");

wiki.login(userName, password);

var page = "Test"; // "Main_Page";

wiki.editPage(page,"Test content2");

var rawWikiText = wiki.raw(page);
var htmlText = wiki.html(page);

return rawWikiText.line().line() + htmlText;
person Dinis Cruz    schedule 22.04.2010
comment
Извините за это, я недавно переместил этот API в более центральное место. Вы можете найти этот файл здесь: o2platform.googlecode.com/svn / trunk / O2_Scripts / APIs / MediaWiki / это основной API, используемый в этом файле o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/, и это инструмент с графическим интерфейсом, созданный на основе этих APIS o2platform.googlecode.com/svn/trunk/O2_Scripts/Tools/ Если вы хотите попробовать эти скрипты, они являются частью платформы O2, которую вы можете получить на o2platform.com - person Dinis Cruz; 15.06.2010

Кажется, вы отправляете входные данные в HTTP POST, но, похоже, вам следует использовать HTTP GET.

Из документации MediaWiki API:

API принимает входные данные через параметры в строке запроса. Каждый модуль (и каждый подмодуль action = query) имеет свой собственный набор параметров, который указан в документации и в action = help и может быть получен с помощью action = paraminfo. http://www.mediawiki.org/wiki/API:Data_formats

person Tommi Forsström    schedule 21.04.2009