本篇文章给大家介绍在使用c#调用百度地图api时遇到的SN校验失败问题的解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

在使用c#调用百度地图Web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略

1.首先获取ak与sk,这个两个东西可以从控制台中获取到

2.在这个地址:sn签名算法,里面提供了java,php,c#,python2.7的参考代码

在百度提供的参考代码中,其中c#的代码中MD5加密方法是有问题的,(在笔者写随笔时,代码还是有问题的,之后希望百度官方修复此问题)

c#之解决百度地图api APP SN校验失败问题(代码实例)

把百度的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] == '%')                 {                     if (buf[i + 1] >= 'a') buf[i + 1] -= 32;                     if (buf[i + 2] >= 'a') 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;         }

写在最后,希望百度官方尽快修改示例中的代码,这样也方便别人拿来用

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问C#视频教程

标签
DT素材网

DT素材网

224

0

0

( 此人很懒并没有留下什么~~ )