2009-04-21 6 views
10

Cela peut être un problème pathétiquement simple, mais je n'arrive pas à formater le message webrequest/response pour obtenir des données du Wikipedia API. J'ai posté mon code ci-dessous si quelqu'un peut m'aider à voir mon problème.WebRequête pour se connecter à l'API Wikipedia

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

À première vue, vous êtes le code semble bon. Comment le problème se présente-t-il spécifiquement? Quelle est l'exception? –

+0

L'exception est la suivante: Le serveur distant a renvoyé une erreur: (417) L'attente a échoué. – NickJ

+0

@NickJ: Essayez mon code ci-dessous. Ça a marché. – Keltex

Répondre

6

Vous pouvez essayer une requête GET d'abord parce qu'il est un peu plus simple (vous aurez seulement besoin de POST pour la connexion wikipedia). Par exemple, essayez de simuler cette demande:

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

Voici le 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: L'autre problème qu'il connaît à la demande POST a été, The exception is : The remote server returned an error: (417) Expectation failed. Il peut être résolu par la mise en :

(C'est de: HTTP POST Returns Error: 417 "Expectation Failed.")

+0

Merci Keltex, Je peux obtenir le Get fonctionne assez facilement. en utilisant: WebRequest req = WebRequest.Create (adresse + "?" + Données) en tant que WebRequest; en utilisant (WebResponse resp = req.GetResponse() en tant que WebResponse) { StreamReader readme = new StreamReader (resp.GetResponseStream()); divWikiData.InnerText = readme.ReadToEnd(); } Cette demande Post me dégoûte encore - et j'ai besoin de publier pour certaines des actions que l'API permet .. – NickJ

+0

Nick, pouvez-vous s'il vous plaît laissez-nous savoir quel genre de problème votre demande POST affiche. Quelle est l'exception que vous obtenez? Comment se comporte-t-il? –

+0

L'exception est la suivante: L'exception est: Le serveur distant a renvoyé une erreur: (417) L'attente a échoué. – NickJ

0

Vous semblez pousser les données d'entrée sur HTTP POST, mais il semble que vous devriez utiliser HTTP GET.

de l'API MediaWiki docs:

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

Je suis actuellement dans la phase finale de la mise en œuvre d'une API C# MediaWiki qui permet de simplifier l'écriture de la plupart des actions de visualisation et d'édition de MediaWiki.

L'API principale est ici: http://o2platform.googlecode.com/svn/trunk/O2%20-%20All%20Active%20Projects/O2_XRules_Database/_Rules/APIs/OwaspAPI.cs et voici un exemple de l'API en cours d'utilisation:

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

Le lien est cassé. Avez-vous un lien mis à jour? – Gabe

+1

Désolé, j'ai déplacé cette API récemment vers un emplacement plus central. Vous pouvez trouver ce fichier ici: http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/OwaspWikiAPI.cs cette API principale utilisée sur ce fichier http://o2platform.googlecode.com/svn/trunk/O2_Scripts/APIs/MediaWiki/O2MediaWikiAPI.cs ce qui est un outil graphique construit sur ces APIS http://o2platform.googlecode.com/svn/trunk/ O2_Scripts/Tools/MediaWikiEditor.cs.o2 Si vous voulez essayer ces scripts, ils font partie de la plateforme O2 que vous pouvez trouver sur http://o2platform.com/ –

Questions connexes