Lat和Lon撰写的Yahoo Weather API

时间:2019-05-26 09:22:26

标签: c# android xamarin.forms

我正在Xamarin.Form中编写天气应用程序。我正在使用Yahoo API。通过城市名称参数获取天气没有问题。但是,当我更改代码以使用经度和纬度时,天气不会出现。

要下载天气,请使用以下页面中的示例:https://developer.yahoo.com/weather/documentation.html#oauth-csharp

我以以下方式处理它:

lSign = string.Format( 
                "format={0}&" +
                "lat={1}&" +
                "lon={2}&" +
                "oauth_consumer_key={3}&" +
                "oauth_nonce={4}&" +
                "oauth_signature_method={5}&" +
                "oauth_timestamp={6}&" +
                "oauth_version={7}&" +
                "u={8}",
                cFormat,
                szerokosc,
                dlugosc,
                cConsumerKey,
                lNonce,
                cOAuthSignMethod,
                lTimes,
                cOAuthVersion,
                jednostka.ToString().ToLower()

(...)

url = cURL + "?lat=" + szerokosc + "&lon=" + dlugosc + "&u=" + jednostka.ToString().ToLower() + "&format=" + cFormat;

2 个答案:

答案 0 :(得分:0)

根据文档,lSign用于身份验证。不应更改它,请从该字符串中删除这些"lat={1}&" + "lon={2}&"

  

说请不要简单地更改任何参数的值   重新排序。

位置信息应包含在请求url中,授权信息应添加到标头中。

// Add Authorization
lClt.Headers.Add ( "Authorization", _get_auth () );
// The request URL
lURL = cURL + "?" + "lat=" + szerokosc + "&lon=" + dlugosc + "&format=" + cFormat;

答案 1 :(得分:0)

不幸的是,仅从变量" lat = {1} & " + " lon = {2} & "中删除lSign并不能解决问题。

例如,要使用城市名称获取天气数据,

lSign = string.Format(
                "format={0}&" +
                "location={1}&" +
                "oauth_consumer_key={2}&" +
                "oauth_nonce={3}&" +
                "oauth_signature_method={4}&" +
                "oauth_timestamp={5}&" +
                "oauth_version={6}&" +
                "u={7}",
                cFormat,
                miasto,
                cConsumerKey,
                lNonce,
                cOAuthSignMethod,
                lTimes,
                cOAuthVersion,
                jednostka.ToString().ToLower()

url = cURL + "?location=" + Uri.EscapeDataString(miasto) + "&u=" + jednostka.ToString().ToLower() + "&format=" + cFormat;

string headerString = _get_auth();

                    WebClient webClient = new WebClient();
                    webClient.Headers[HttpRequestHeader.ContentType] = "application/" + cFormat;
                    webClient.Headers[HttpRequestHeader.Authorization] = headerString;
                    webClient.Headers.Add("X-Yahoo-App-Id", cAppID);
                    byte[] reponse = webClient.DownloadData(url);
                    string lOut = Encoding.ASCII.GetString(reponse);