2009-08-14 6 views
1

J'essaie d'interagir avec l'API Google Reader (non documentée/non officielle) en utilisant les informations de this page. Ma première étape est d'obtenir un SID et un jeton, ce qui fonctionne bien, mais je n'arrive pas à POST rien sans avoir une erreur 401.Pourquoi une erreur 401 (non autorisée) s'affiche-t-elle lors de la POSTATION sur l'API Google Reader?

Voici le code que je utilise pour obtenir mon SID et le jeton:

static string getSid() 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.google.com/accounts/ClientLogin?service=reader&Email=username&Passwd=password"); 
     req.Method = "GET"; 
     string sid; 

     HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
     using (var stream = response.GetResponseStream()) 
     { 
      StreamReader r = new StreamReader(stream); 
      string resp = r.ReadToEnd(); 

      int indexSid = resp.IndexOf("SID=") + 4; 
      int indexLsid = resp.IndexOf("LSID="); 
      sid = resp.Substring(indexSid, indexLsid - 5); 

      return sid; 
     } 
    } 

Et pour générer un cookie et obtenir le jeton:

static Cookie getCookie(string sid) 
    { 
     Cookie cookie = new Cookie("SID", sid, "/", ".google.com"); 
     return cookie; 
    } 

    static string getToken(string sid, Cookie cookie) 
    { 
     string token; 
     string url = "http://www.google.com/reader/api/0/token"; 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     req.CookieContainer = new CookieContainer(); 
     req.CookieContainer.Add(cookie); 

     HttpWebResponse response = (HttpWebResponse)req.GetResponse(); 
     using (var stream = response.GetResponseStream()) 
     { 
      StreamReader r = new StreamReader(stream); 
      token = r.ReadToEnd(); 
      return token; 
     } 
    } 

Maintenant, si je tente de faire POST (dans cet exemple, insérer une nouvelle balise) en utilisant ce qui suit, j'obtiens l'erreur 401.

static void insertTag(string tag, Cookie cookie) 
    { 
     string result = ""; 
     string data = Uri.EscapeDataString("a="+tag+"&T=" + Program.token); 

     byte[] buffer = Encoding.GetEncoding(1252).GetBytes(data); 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create 
      ("http://www.google.com/reader/api/0/edit-tag?client=-"); 
     WebReq.Method = "POST"; 

     WebReq.Credentials = new NetworkCredential("username", "password"); 


     WebReq.ContentType = "application/x-www-form-urlencoded"; 
     WebReq.ContentLength = buffer.Length; 

     Stream PostData = WebReq.GetRequestStream(); 

     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader _Answer = new StreamReader(Answer); 
     result = _Answer.ReadToEnd(); 

     if (result.Length < 0) 
      result = ""; 
    } 

L'erreur se produit sur la ligne Stream Answer = WebResp.GetResponseStream();

Répondre

1

que j'étais Transforme en utilisant le mauvais URL pour accéder aux API Google Reader grâce à une documentation périmée! L'URL correcte pour l'ajout d'étiquettes dans Google Reader (Août 2009) est http://www.google.com/reader/api/0/subscription/edit?client=scroll avec des arguments POST a = utilisateur/-/label/[étiquette] & s = alimentation/[url FEED] & ac = modifier & T = [token]

+0

par hasard, connaissez-vous l'url nécessaire pour l'abonnement en utilisant les nouveaux changements s'il vous plaît? parce que je reçois toujours l'erreur 401 et je devine que cela a à voir avec l'URL – ict1991

1

Vous devez vérifier que vous disposez d'un ensemble d'agent utilisateur. J'ai couru dans ce même problème avant quand je n'ai pas l'ai placé.

Par exemple:

WebClient client = new WebClient(); 

client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); 

Ou: MSDN Link

myHttpWebRequest=(HttpWebRequest)WebRequest.Create("http://www.contoso.com"); 
myHttpWebRequest.UserAgent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"; 
Questions connexes