2016-03-29 6 views
2

次のコードでYahoo Weather Service APIで認証できません。 私は何が間違っていますか?私は401 - Unauthorizedを取得しています。 xml.weather.yahoo.comで試してみた - 同じこと。私はしばらくの間、これで私の頭を壊してきたので、どんな助けも高く評価されます。Yahoo Weather APIコール(Oauth C#またはVB.netを使用)

CODE:

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サイトから奇妙な動作を見ます。同様のコードで私のコードは401を返す - 80%のケースで無許可。 〜10%の場合、それは私にデータを取得します。 (残りの10%は他のランダムな障害のためのものです) – jing

答えて

0

OKので、私はこれを自分で解決してきました。 解決策は少し異なり、認証を必要としません。私と他の多くの人がやろうとしていたことは、Yahooが認証ポリシーを変更した後に「場所による天気」を働かせることだった。しかし、「天気予報」はこれを必要としません。したがって、上記の問題に対する回避策は次のとおりです。

 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 

ご覧のとおり、私は参照用にコメントアウトした古いURL文字列を残しました。 新しいURL文字列にはweather.forecastメソッドが呼び出され、WOIDが使用された別の方法が含まれています。 hereを見つけることができます。 重要:URLを送信する前に、URLをエンコードする方法を使用する必要はありません。あなたはそれをそのまま使用することができます。 私の機能で使用されているURLには、単位が「u」、摂氏が「c」の%20u%3D%27c%27セクションの摂氏が含まれています。必要に応じて、 "c"を "f"に置き換えることができます。 この関数は、予測のすべての部分を含むデータセットを返します。それぞれのデータセットは、必要に応じて使用できます。 幸運の友人。