ホームページ  >  記事  >  バックエンド開発  >  C# は、Baidu Map API APP SN 検証エラーの問題を解決します (コード例)

C# は、Baidu Map API APP SN 検証エラーの問題を解決します (コード例)

青灯夜游
青灯夜游転載
2018-10-18 14:32:483758ブラウズ

この記事では、C# を使用して Baidu Map API を呼び出すときに発生する SN 検証エラーの問題の解決策を紹介します。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。

C# を使用して Baidu Map Web サービス API を呼び出すときに発生した署名 (SN​​ 検証) の問題がここに記録されています ( IP ホワイトリスト検証は無視してください )

1.まず ak と sk を取得します。これら 2 つはコンソール

2 から取得できます。このアドレスでは、java、php、c#、python2.7 を提供する sn 署名アルゴリズムが提供されます。参照コード

Baidu が提供するリファレンス コードには、C# コードの MD5 暗号化方式に問題があります (著者がエッセイを書いた時点では、まだコードに問題がありました。Baidu が後でこの問題を正式に修正することを願っています)

Baidu の MD5 メソッドを変更すると、署名が正しくなり、API が正常に呼び出されるようになります。幸いです。 !

これが完全な署名コードです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace IpService.Code
{
    public class BaiduAKSNCaculater
    {
        private static string MD5(string password)
        {
            try
            {
                System.Security.Cryptography.HashAlgorithm hash = System.Security.Cryptography.MD5.Create();
                byte[] hash_out = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));

                var md5_str=BitConverter.ToString(hash_out).Replace("-", "");
                return md5_str.ToLower();

            }
            catch
            {
                
                throw;
            }
        }

        private static string UrlEncode(string str)
        {
            str = System.Web.HttpUtility.UrlEncode(str);
            byte[] buf = Encoding.ASCII.GetBytes(str);//等同于Encoding.ASCII.GetBytes(str)
            for (int i = 0; i < buf.Length; i++)
                if (buf[i] == &#39;%&#39;)
                {
                    if (buf[i + 1] >= &#39;a&#39;) buf[i + 1] -= 32;
                    if (buf[i + 2] >= &#39;a&#39;) buf[i + 2] -= 32;
                    i += 2;
                }
            return Encoding.ASCII.GetString(buf);//同上,等同于Encoding.ASCII.GetString(buf)
        }

        private static string HttpBuildQuery(IDictionary<string, string> querystring_arrays)
        {

            StringBuilder sb = new StringBuilder();
            foreach (var item in querystring_arrays)
            {
                sb.Append(UrlEncode(item.Key));
                sb.Append("=");
                sb.Append(UrlEncode(item.Value));
                sb.Append("&");
            }
            sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        }

        public static string CaculateAKSN(string ak, string sk, string url, IDictionary<string, string> querystring_arrays)
        {
            var queryString = HttpBuildQuery(querystring_arrays);

            var str = UrlEncode(url + "?" + queryString + sk);
           
            return MD5(str);
        }
    }
}

ここが呼び出しコードです

public static string GetIPAreas()
        {
            var ip = "你要查询的ip地址";
            var ak = "从百度控制台获取到应用AK";
            var sk = "从百度控制台获取到签名SK";
            var uri = "http://api.map.baidu.com";
            var path = "/location/ip";
            var param = new Dictionary<string, string>();
            param.Add("ip", ip);
            param.Add("ak", ak);

            //注意:签名的url参数,并非完整地址
            var sn = BaiduAKSNCaculater.CaculateAKSN(ak, sk, path, param);

            var url = string.Format("{0}{1}?ip={2}&ak={3}&sn={4}",
                uri,
                path,
                ip,
                ak,
                sn);

            var str = Code.HttpService.Get(url);
            return str;
        }

最後に書かれていますが、Baidu 関係者がサンプルのコードをできるだけ早く修正してくれることを願っています。他の人が使用できるようにすることができます。

を使用して要約します。 上記がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、C#ビデオ チュートリアルをご覧ください。

以上がC# は、Baidu Map API APP SN 検証エラーの問題を解決します (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。