2009-08-14 6 views
1

Ich versuche, mit der Google Reader (undokumentierte/inoffizielle) API unter Verwendung von Informationen aus this page zu interagieren. Mein erster Schritt besteht darin, eine SID und ein Token zu bekommen, was gut funktioniert, aber ich kann nichts POSTIEREN, ohne einen 401-Fehler zu bekommen.Warum erhalte ich einen 401 (nicht autorisierten) Fehler beim POST auf Google Reader API?

Hier ist der Code, den ich mit meinem SID und Token zu erhalten:

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

Und zu erzeugen, ein Cookie und das Token erhalten:

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

Nun, wenn ich versuche, eine zu tun POST (in diesem Beispiel, fügen Sie ein neues Tag) mit dem folgenden, bekomme ich den Fehler 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 = ""; 
    } 

Der Fehler tritt auf der Linie Stream Answer = WebResp.GetResponseStream();

Antwort

1

Stellt sich heraus, ich war die falsche URL mit den Google Reader APIs dank einiger veraltete Dokumentation zugreifen! Die richtige URL für Etiketten in Google Reader Hinzufügen (Stand August 2009) ist http://www.google.com/reader/api/0/subscription/edit?client=scroll mit POST Argumente a = user/-/label/[Ihr label] & s = Feed/[feed url] & ac = bearbeiten & T = [token]

+0

wissen Sie zufällig, die URL für das Abonnement mit den neuen Änderungen bitte benötigt? weil ich immer noch den Fehler 401 bekomme und ich vermute, dass es mit der URL zu tun hat – ict1991

1

Sie verdoppeln müssen überprüfen, dass Sie einen User-Agent festgelegt haben. Ich habe das gleiche Problem schon einmal erlebt, als ich es nicht eingestellt hatte.

Zum Beispiel:

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;)"); 

Oder: 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;)";