Maison >développement back-end >Tutoriel C#.Net >C# résout le problème de l'échec de la vérification Baidu Map API APP SN (exemple de code)

C# résout le problème de l'échec de la vérification Baidu Map API APP SN (exemple de code)

青灯夜游
青灯夜游avant
2018-10-18 14:32:483863parcourir

Cet article vous présentera la solution au problème d'échec de la vérification SN rencontré lors de l'utilisation de C# pour appeler l'API Baidu Maps. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Le problème de signature (vérification SN) rencontré lors de l'utilisation de C# pour appeler l'API du service Web Baidu Map, enregistrez-le ici, (Veuillez ignorer la vérification de la liste blanche IP)

1 . Obtenez d'abord ak et sk, ces deux choses peuvent être obtenues depuis la console

2 À cette adresse : algorithme de signature sn, qui fournit java, php, c#, python2.7 Code de référence

Dans le code de référence fourni par Baidu, il y a un problème avec la méthode de cryptage MD5 dans le code c# (Lorsque l'auteur a écrit l'essai, il y avait toujours un problème avec le code. J'espère que Baidu résoudra officiellement ce problème plus tard)

Modifiez la méthode MD5 de Baidu, la signature sera correcte, et l'API sera appelée normalement, content ! !

Voici le code de signature complet

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);
        }
    }
}
Voici le code d'appel

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;
        }
Écrit à la fin, j'espère que les responsables de Baidu modifieront le code dans le exemple dès que possible, afin qu'il soit pratique pour les autres de l'utiliser

Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il pourra être utile à l'apprentissage de chacun. Pour plus de didacticiels connexes, veuillez visiter le

Tutoriel vidéo C# !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer