本篇文章给大家介绍在使用c#调用百度地图api时遇到的sn校验失败问题的解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。
在使用c#调用百度地图web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略)
1.首先获取ak与sk,这个两个东西可以从控制台中获取到
2.在这个地址:sn签名算法,里面提供了java,php,c#,python2.7的参考代码
在百度提供的参考代码中,其中c#的代码中md5加密方法是有问题的,(在笔者写随笔时,代码还是有问题的,之后希望百度官方修复此问题)
把百度的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#视频教程!
以上就是c#之解决百度地图api app sn校验失败问题(代码实例)的详细内容。