2009-04-21 13 views
10

Może to być prosty żałośnie problem, ale nie mogę sformatować postu webrequest/odpowiedź, aby uzyskać dane z Wikipedia API. Poniżej zamieszczam mój kod, jeśli ktoś może mi pomóc zobaczyć mój problem.WebRequest, aby połączyć się z API Wikipedii

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(); 
    } 
+1

Na pierwszy rzut oka masz kod wygląda dobrze. W jaki sposób problem konkretnie się przedstawia? Jaki jest wyjątek? –

+0

Wyjątek: Serwer zdalny zwrócił błąd: (417) Nieudane oczekiwanie. – NickJ

+0

@NickJ: Wypróbuj mój kod poniżej. Zadziałało. – Keltex

Odpowiedz

6

Możecie spróbować żądanie GET po pierwsze dlatego, że to trochę prostsze (trzeba będzie tylko post na wikipedia logowania). Na przykład, starają się symulować ten wniosek:

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

Oto kod:

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(); 
    } 
} 

Edit: Innym problemem był przeżywa na żądanie POST został, The exception is : The remote server returned an error: (417) Expectation failed. To może być rozwiązany przez ustawienie :

(to jest z: HTTP POST Returns Error: 417 "Expectation Failed.")

+0

Dzięki Keltex, Mogę sprawić, że praca działa wystarczająco łatwo. za pomocą: WebRequest req = WebRequest.Create (adres + "?" + Dane) jako WebRequest; przy użyciu (WebResponse resp = req.GetResponse() jako WebResponse) { StreamReader readme = nowy StreamReader (resp.GetResponseStream()); divWikiData.InnerText = readme.ReadToEnd(); } Żądanie dotyczące postu nadal mnie oczyszcza - i potrzebuję wpisu dla niektórych działań, które api pozwala .. – NickJ

+0

Nick, czy możesz nam powiedzieć, jaki rodzaj problemu wyświetla twoje żądanie POST. Jaki jest wyjątek? Jak się zachowuje? –

+0

Wyjątkiem jest: Wyjątek: Serwer zdalny zwrócił błąd: (417) Oczekiwanie nie powiodło się. – NickJ

0

Wydaje się, że naciskasz dane wejściowe na HTTP POST, ale wydaje się, że powinieneś użyć HTTP GET.

Od docs API MediaWiki:

The API takes its input through parameters in the query string. Every module (and every action=query submodule) has its own set of parameters, which is listed in the documentation and in action=help, and can be retrieved through action=paraminfo. http://www.mediawiki.org/wiki/API:Data_formats

1

Jestem obecnie na końcowym etapie wdrażania API C# MediaWiki, który pozwala na łatwe wykonywanie skryptów większości akcji przeglądania i edycji MediaWiki.

Głównym API jest tutaj: http://o2platform.googlecode.com/svn/trunk/O2%20-%20All%20Active%20Projects/O2_XRules_Database/_Rules/APIs/OwaspAPI.cs i tutaj jest przykładem API w użyciu:

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

Link jest uszkodzony. Czy masz zaktualizowany link? – Gabe

+1

Przepraszam za to, że przeniosłem ostatnio to API do bardziej centralnej lokalizacji. Można znaleźć ten plik tutaj: http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/OwaspWikiAPI.cs to jest główny API stosowane w tym pliku http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/O2MediaWikiAPI.cs i jest to narzędzie GUI zbudowane na bazie tych APIS http://o2platform.googlecode.com/svn/trunk/ O2_Scripts/Tools/MediaWikiEditor.cs.o2 Jeśli chcesz wypróbować te skrypty, są one częścią platformy O2, którą możesz pobrać z http://o2platform.com/ –

Powiązane problemy