WebRequest для подключения к API Википедии - PullRequest
10 голосов
/ 21 апреля 2009

Это может быть патетически простая проблема, но я не могу отформатировать после веб-запроса / ответа, чтобы получить данные из Wikipedia 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();
    }

Ответы [ 3 ]

6 голосов
/ 21 апреля 2009

Возможно, вы сначала захотите попробовать запрос 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 «Ожидание не выполнено». )

1 голос
/ 22 апреля 2010

В настоящее время я нахожусь на завершающей стадии реализации API MediaWiki C #, который позволяет легко создавать сценарии большинства действий по просмотру и редактированию 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;
0 голосов
/ 21 апреля 2009

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

Из документов API MediaWiki:

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

...