2016-03-26 5 views
2

Ich bin fest auf die Umsetzung der Yahoo Weather private API Anruf. Dies ist mein Code-Snippet, wenn ich es mit der gültigen clientId & Secret aufrufen 401 (nicht autorisiert).Yahoo Weather API mit Oauth

var outhWc = new WebClient(); 
outhWc.Credentials = new NetworkCredential(clientId, clientSecret); 
outhWc.Headers.Add(HttpRequestHeader.Accept, "application/json"); 
var outhresponse = outhWc.DownloadData("https://query.yahooapis.com/v1/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22nome%2C%20ak%22)&format=json"); 

Es löst immer eine Ausnahme aus. Ich versuche auch, Benutzernamen und Passwort in NetworkCredentials zu übergeben und auch versuchen, clientId und Secret in Header übergeben, aber ich kann einen erfolgreichen Anruf nicht finden.

Antwort

1

Also ich habe mit dem gleichen Problem hier festgefahren. Schließlich implementiert ich den folgenden Code, basierend auf dem oAuth C# einfache Klasse bei http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs gefunden

public void LoadWeather() { 
     string URLDes, Params = ""; 
     string Signature, BaseURL, cKey, cSecret = ""; 

     OAuthBase oAuth = new OAuthBase(); 
     BaseURL = "http://weather.yahooapis.com/forecastrss?w=" + textBox1.Text + "&u=f"; 
     cKey = "YOUR API KEY"; 
     cSecret = "YOUR API SECRET"; 

     Signature = oAuth.GenerateSignature(new Uri(BaseURL), cKey, cSecret, "", "", "GET", oAuth.GenerateTimeStamp(), oAuth.GenerateNonce(), out URLDes, out Params); 

     WebClient wc = new WebClient(); 
     wc.DownloadStringCompleted += HttpsCompleted; 
     wc.DownloadStringAsync(new Uri(String.Format("{0}?{1}&oauth_signature={2}", URLDes, Params, Signature))); 
    } 

    private void HttpsCompleted(object sender, DownloadStringCompletedEventArgs e) { 
     if (e.Error == null) { 
      XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None); 
      xdoc.Save("c:\\weather.xml"); 
      richTextBox1.Text = xdoc.FirstNode.ToString(); 
     } else { 
      richTextBox1.Text = e.Error.Message; 
     } 
    } 

Wie Sie sehen können, habe ich bereits die Stadt ID haben. In diesem Beispiel wird die von der API zurückgegebene XML-Zeichenfolge heruntergeladen. Arbeitete für mich, hoffe es hilft!