2009-04-21 7 views
10

Dies mag ein pathetisch einfaches Problem sein, aber ich kann nicht scheinen, die Post webrequest/response zu formatieren, um Daten aus der Wikipedia API zu erhalten. Ich habe meinen Code unten gepostet, wenn jemand mir helfen kann, mein Problem zu sehen.WebRequest zur Verbindung mit der 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(); 
    } 
+1

Auf den ersten Blick Sie Code sieht gut aus. Wie stellt sich das Problem konkret dar? Was ist die Ausnahme? –

+0

Die Ausnahme ist: Der Remote-Server hat einen Fehler zurückgegeben: (417) Erwartung fehlgeschlagen. – NickJ

+0

@NickJ: Versuchen Sie meinen Code unten. Es funktionierte. – Keltex

Antwort

6

Vielleicht möchten Sie zuerst eine GET-Anforderung, um zu versuchen, weil es ein wenig einfacher ist (Sie werden nur für wikipedia Login POST benötigen). Zum Beispiel versuchen, diese Anforderung zu simulieren:

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

Hier ist der Code:

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: Das andere Problem, das er auf der POST-Anfrage erlebt wurde, The exception is : The remote server returned an error: (417) Expectation failed. Es kann durch Einstellung gelöst werden :

(Dies ist aus: HTTP POST Returns Error: 417 "Expectation Failed.")

+0

Dank Keltex, Ich kann die Get leicht genug bekommen. Verwendung: WebRequest Req = WebRequest.Create (Adresse + "?" + Daten) als WebRequest; mit (WebResponse resp = req.GetResponse() als WebResponse) { StreamReader readme = neuer StreamReader (resp. GetResponseStream()); divWikiData.InnerText = readme.ReadToEnd(); } Diese Post Anfrage entbindet mich immer noch - und ich brauche Post für einige der Aktionen der API erlaubt .. – NickJ

+0

Nick, können Sie uns bitte wissen, welche Art von Problem Ihre POST-Anfrage angezeigt wird. Was ist die Ausnahme, die du bekommst? Wie verhält es sich? –

+0

Die Ausnahme ist: Die Ausnahme ist: Der Remote-Server hat einen Fehler zurückgegeben: (417) Erwartung fehlgeschlagen. – NickJ

0

Sie scheinen die Eingabedaten auf HTTP POST zu schieben, aber es scheint, dass Sie HTTP GET verwenden sollten.

Aus den MediaWiki API-Dokumentation:

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

Ich bin derzeit in der Endphase der Implementierung einer C# MediaWiki API, die das einfache Scripting der meisten MediaWiki Anzeige- und Bearbeitungsaktionen ermöglicht.

Die Haupt API ist hier: http://o2platform.googlecode.com/svn/trunk/O2%20-%20All%20Active%20Projects/O2_XRules_Database/_Rules/APIs/OwaspAPI.cs und hier ist ein Beispiel für die API im Einsatz:

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

Die Verbindung ist unterbrochen. Haben Sie einen aktualisierten Link? – Gabe

+1

Entschuldigung, ich habe diese API kürzlich an einen zentraleren Ort verschoben. Sie können diese Datei finden Sie hier: http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/OwaspWikiAPI.cs dies der Haupt API ist für diese Datei verwendet http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/O2MediaWikiAPI.cs und dies ist ein GUI-Tool auf dieser APIS gebaut http://o2platform.googlecode.com/svn/trunk/ O2_Scripts/Tools/MediaWikiEditor.cs.o2 Wenn Sie diese Skripts ausprobieren möchten, sind sie Teil der O2-Plattform, die Sie von http://o2platform.com/ erhalten können. –