2016-03-29 24 views
2

Aşağıdaki kod aracılığıyla Yahoo hava durumu servis API'sini doğrulayamıyorum. Neyi yanlış yapıyorum? 401 alıyorum - Yetkisiz. Xml.weather.yahoo.com üzerinden denendi - aynı şey. Şimdi bir süredir kafamı kırıyordum, bu yüzden herhangi bir yardım takdir edilecektir.Yahoo Hava API çağrısı Oauth C# veya VB.net kullanarak

KODU:

Public Function getData() As String 
    Dim resp As String = "" 
    Try 
     Dim consumerKey As String = "MY PRIVATE API KEY STRING GOES HERE" 
     Dim consumerSecret As String = "SECRET WAS PLACED HERE" 
     Dim uri = New Uri("https://query.yahooapis.com/v1/yql?q=SELECT%20*%20FROM%20weather.bylocation%20WHERE%20location%3D%27Kefar-Weradim%27%20AND%20unit%3D%22c%22&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys") 
     Dim url As String, param As String 
     Dim oAuth = New OAuthBase() 
     Dim nonce = oAuth.GenerateNonce() 
     Dim timeStamp = oAuth.GenerateTimeStamp() 
     Dim signature = oAuth.GenerateSignature(uri, consumerKey, consumerSecret, String.Empty, String.Empty, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, url, param) 
     Using _webResponse As WebResponse = WebRequest.Create(String.Format("{0}?{1}&oauth_signature={2}", url, param, signature)).GetResponse() 
      Using reader As StreamReader = New StreamReader(_webResponse.GetResponseStream()) 
       resp = reader.ReadToEnd() 
      End Using 
     End Using 
    Catch ex As Exception 
     resp = "Error: " & ex.Message 
    End Try 
    Return resp 
End Function 
+0

yahoo API sitesinden garip davranışlar görüyorum. Benzer kod ile kodum 401'i döndürür -% ~ 80'inde yetkisizdir. ~% 10 vakada bana veriyi veriyor. (geri kalan% 10 diğer rastgele başarısızlıklardır) – jing

cevap

0

Tamam, bu yüzden bu kendim çözdüm. Çözüm biraz farklı ve kimlik doğrulaması gerektirmiyor. Ben ve diğer birçok insanın yapmaya çalıştığı şey, Yahoo'nun kimlik doğrulama politikasını değiştirdikten sonra çalışmak için "hava durumuna göre konum" u elde etmektir. Ancak, "hava durumu tahmini" bunu gerektirmez. Öyleyse, yukarıdaki sorunun çözümü için bir çözüm.

 Private Function GetDSfromYH() As DataSet 
    Dim surl As String = "" 
    Dim ds As New DataSet 
    Dim sbResult As New StringBuilder 
    Try 
     'surl = "https://query.yahooapis.com/public/v1/yql?q=SELECT%20*%20FROM%20weather.bylocation%20WHERE%20location%3D%27Kefar-Weradim%27%20AND%20unit%3D%22c%22&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"' 
     surl = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%3D1967578%20and%20u%3D%27c%27&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" 
     ds.ReadXml(surl) 
     Return ds 

    Catch ex As Exception 
     sbResult.Append("<div>Exception in function 'GetDSfromYH': " & ex.Message & " </div>") 
     sbResult.Append("<div style='max-width: 200px;'>Oops, there is a problem with the service. Please refresh the page or try later.</div>") 
     divResults.Controls.Add(New LiteralControl(sbResult.ToString())) 
    End Try 


End Function 

Gördüğünüz gibi, eski URL dizesini referans olarak yorumlanmış olarak bıraktım. Yeni URL dizesi, weather.forecast yönteminin çağrılması ve WOID kullanımı ile farklı bir yaklaşım içerir. here numaralı telefonu bulabilirsiniz. Önemli: URL'yi göndermeden önce kodlamak için herhangi bir yöntem kullanmaya gerek yoktur. "As-Is" kullanabilirsiniz. İşlevimde kullanılan URL,% 20u% 3D% 27c% 27 bölümünde selsius, Units olarak "u" ve santigrat olarak "c" içerir. Gerekirse "c" yi "f" ile değiştirebilirsiniz. Bu işlev, tahminlerin tüm parçalarını içeren bir DataSet'i döndürür - her biri kendi veri tabanınız olarak, ihtiyaç duyduğunuz şekilde kullanabilirsiniz. İyi şanslar arkadaşlar.

İlgili konular