tnblog
首页
视频
资源
登录

关于百度地图WebApi调用返回APP SN校验失败的解决

560人阅读 2024/12/16 11:07 总访问:50603 评论:0 收藏:0 手机
分类: .NET
  1. //官网上面有sn校验的demo 其中包括Java,PHP,C#,Python 这里主要说C#的 详情参照附录 'https://lbsyun.baidu.com/faq/api?title=webapi/appendix'
  2. //当我们按照官网给的代码运行起来时,返回一个APP SN 校验失败,因为官网的代码没有问题,但是有些细节并没有标注出来
  3. //1.MD5加密方法, System.Security.Cryptography.MD5CryptoServiceProvider 该方法,目前测试情况,在.Net4.0以上(6.0/8.0)是被弃用的(但是弃用不代表不能用,不建议使用,高版本有替换的)
  4. //2.URL,参数键值对没有说明,一个错误就会导致sn码生成错误
  5. //---解决
  6. //1. MD5升级代码
  7.  private static string _MD5(string password)
  8.  {
  9.      try
  10.      {
  11.          byte[] inputBytes = Encoding.UTF8.GetBytes(password);
  12.          MD5 md5Hash = MD5.Create();
  13.          byte[] hashBytes = md5Hash.ComputeHash(inputBytes);
  14.          string ret = "";
  15.          for (int i = 0; i < hashBytes.Length; i++)
  16.          {
  17.              ret += hashBytes[i].ToString("X2");
  18.          }
  19.          return ret.ToString();       
  20.      }
  21.      catch
  22.      {
  23.          throw;
  24.      }
  25.  }
  26.  //2. 参数说明: 
  27.    /// <summary>
  28.    ///     
  29.    /// </summary>
  30.    /// <param name="ak">AK(此方法未使用)</param>
  31.    /// <param name="sk">AK对应SN校验方式SK(个人主页控制台获取)</param>
  32.    /// <param name="url">请求接口路径 此路径不包括IP 如 行政区域检索接口 ' 只需要传递 /place/v2/suggestion</param>
  33.    /// <param name="querystring_arrays">请求接口参数键值对 包括ak不包括sn</param>
  34.    /// <returns></returns>
  35.    public static string CaculateAKSN(string ak, string sk, string url, IDictionary<stringstring> querystring_arrays)
  36.    {
  37.        var queryString = HttpBuildQuery(querystring_arrays);
  38.        var str = UrlEncode(url + "?" + queryString + sk);
  39.        return _MD5(str).ToLower();//返回的sn码需要小写的
  40.    }
  41.    
  42.    private static string UrlEncode(string str)
  43.    {
  44.      str = System.Web.HttpUtility.UrlEncode(str);
  45.      byte[] buf = Encoding.ASCII.GetBytes(str);//等同于Encoding.ASCII.GetBytes(str)
  46.      for (int i = 0; i < buf.Length; i++)
  47.        if (buf[i] == '%')
  48.        {
  49.          if (buf[i + 1] >= 'a') buf[i + 1] -= 32;
  50.          if (buf[i + 2] >= 'a') buf[i + 2] -= 32;
  51.          i += 2;
  52.        }
  53.       return Encoding.ASCII.GetString(buf);//同上,等同于Encoding.ASCII.GetString(buf)
  54.    }
  55.   
  56.    private static string HttpBuildQuery(IDictionary<stringstring> querystring_arrays)
  57.    {
  58.   
  59.     StringBuilder sb = new StringBuilder();
  60.     foreach (var item in querystring_arrays)
  61.      {
  62.       sb.Append(UrlEncode(item.Key));
  63.       sb.Append("=");
  64.       sb.Append(UrlEncode(item.Value));
  65.       sb.Append("&");
  66.      }
  67.      sb.Remove(sb.Length - 11);
  68.      return sb.ToString();
  69.    }
  70.    //其余方法参照附录获取'https://lbsyun.baidu.com/faq/api?title=webapi/appendix'
  71.    //代码调用
  72.     string BaseUrl = "https://api.map.baidu.com/place/v2/suggestion";
  73.     var keyValuePairs = new Dictionary<stringstring>
  74.     {
  75.         {"query",name },
  76.         {"region",name },
  77.         {"city_limit","false" },
  78.         {"output","json" },
  79.         {"ak",_apiKey },
  80.     };
  81.     string sn = CaculateAKSN(_apiKey, _apiSK, "/place/v2/suggestion", keyValuePairs);
  82.     var url = $"{BaseUrl}?query={name}&region={name}&city_limit=false&output=json&ak={_apiKey}&sn={sn}";
  83.     //注意,键值对顺序需要和url参数顺序一致 顺序不对等也会造成sn校验失败,其次 sn在url里面固定放在最后
  84.     //! 文章结束,后续有问题的可以留言 交流群号:709342059


评价

为什么要使用webapi而不直接使用controller

彼年豆蔻,谁许谁地老天荒。webapi能做的事情,controller都能做,为什么要使用webapi而不直接使用controller呢?这就好比...

webapi转json格式

创建WebApi项目时出现的xml格式,每次都去转换比较麻烦在Global设置全局输出json格式://直接xml干掉为json GlobalConfigu...

控制台应用程序托管webapi

在没有iis的情况下,webapi是可以自托管的so,我们从写一个webapi程序开始:1、创建一个控制台应用程序,然后在控制台应用...

.net core上传图片,文件。webapi 上传图片文件

上传图片的前台代码都完全一样,直接来贴后台的代码吧publicActionResultUploadImage(List&lt;IFormFile&gt;upfile) { ...

使用swagger创建webapi文档描述---详解

在前后端分离开发中,作为后端如何给前端提供有效直观的接口文档呢?没错,就是使用swagger 俗称“丝袜哥”教程:一、首先...

通过PlUpload控件配合webapi接口完成压缩上传文件

最近一段时间都在使用PlUpload做文件上传的功能,研究过后感觉使用起来体验还是比较好的,不过网上的资料很多都记录的很简...

webapi传递大数据

在接口中传输图片进制流或BASE64字符串时,使用FormUrlEncodedContent处理参数时,可能会因为参数太长导致异常无效的URL:U...

AJAX调用webapi上传图片或文件。设置token,设置Authorization Bearer

AJAX调用webapi上传图片或文件,并返回刚上传的文件名。废话不多说直接贴代码吧html相关:&lt;!DOCTYPEhtml&gt; &lt;html&...

webapi与rpc区别

首先说rpc,rpc的定义是远程过程调用,通俗讲就是客户端通过网络远程调用服务端的方法,比如一个用java写的method。rpc是基...

.NET HttpClient和webapi相关的东东先记录一点。传递Authorization headertoken

get请求传递Authorization header,tokenstringurl=&quot;你请求的url&quot;; stringtoken=&quot;yourtoken&quot;; Http...

webapi报错:Attribute routes with the same name 'Get' must have the same template

是因为 asp.net core 中默认创建的 api controller 中的 Get(id) Action的属性都是[HttpGet(&quot;{id}&quot;, Name = &quo...

net core webapi版本控制

webapi的版本控制好处很多,要实现其实也比较简单。在webapi中根据不同的版本创建文件夹。然后在不同的api里边添加不同的路...

net core webapi路由

如下我们可以通过路由传递两个参数请求地址参考如下: https://localhost:5001/api/home/aojiancc2/2622最后两个可以作为参...

.net webapi Newtonsoft.Json返回需要的字段,忽略某些字段,修改字段名,动态返回需要的字段等

有时候我们在写webapi的时候,不想把正常用的对象所有字段都返回,我们需要进行一些筛选,忽略某些字段,大概说一下几种方法...

.net core webapi json相关,全局配置,时间格式化首字母小写等

在ConfigureServices中可以进行全局json配置,例如,全局处理一下事件格式问题services.AddMvc(option=&gt; { //option.F...
与其用时间去get一个未知的以后,不如做好现在,set自己一个好的以后
排名
46
文章
10
粉丝
1
评论
0
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术