关于java后台接入百度地图返回参数为{"status":211,"message":"APP SN校验失败"}的解决方法
1.关于百度地图,天气预报,微信公众平台等一系列权威机构java接入的认识:
a.首先要认识到的是这些信息都属于外部接口,我们在进行接入的时候一定要注意到这些接口的参数设置,稍微一不留神就会出现接入失败的问题,而这些问题往往是我们不够认真导致的,所以,接入的时候一定要充分阅读官方的文档和示例。
b.这类的官方平台我们要接入都需要注册账号,注册之后需要在平台上进行设置,按照自己的习惯问题一一去设置该设置的参数,然后再去做自己的开发。
c.建议接入之前最好进行简单的接口调用测试,把这些参数都搞清楚再去布局代码。
2.项目需求:最近接到一个项目是工单系统,其中有一项内容是需要用到签到定位功能的,这时候就需要用到地图接口了,我选择了百度地图,当然做的时候最好和前台商量着来,前台最好也去调用百度的地图接口。但是自己做的时候就是出现了上述问题,报错APP SN校验失败,关于这个问题我发帖子和上百度搜索都无果,索性自己研究,最后发现是参数问题,我把ak的值放到了sk的位置,导致去调用接口的时候报错,就下面这一句:

3.最后附上完整的测试代码(也是官方的代码)
//演示get、post请求如何算sn,算得sn如何使用
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap; //需要httpclient-x.x.jar,httpcore-x.x.jar,commons-logging-x.x.jar,commons-httpclient-x.x.jar,commons-codec-x.x.jar包发http请求
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair; @SuppressWarnings("deprecation")
public class test02 {
public static void main(String[] args) throws Exception {
test02 test02 = new test02();
test02.testGet();
test02.testPost();
} @SuppressWarnings("all")
public void testGet() throws Exception {
/**
* 以http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak为例
* ak设置了sn校验不能直接使用必须在url最后附上sn值,get请求计算sn跟url中参数对出现顺序有关,需按序填充paramsMap,
* post请求是按字母序填充,具体参照testPost()
*/
Map paramsMap = new LinkedHashMap<String, String>();
paramsMap.put("address", "百度大厦");
paramsMap.put("output", "json");
paramsMap.put("ak", "XWnIC5k1cguL71ClpinbhmozUsBWY4Xr"); // 调用下面的toQueryString方法,对paramsMap内所有value作utf8编码
String paramsStr = toQueryString(paramsMap); // 对paramsStr前面拼接上/geocoder/v2/?,后面直接拼接yoursk
String wholeStr = new String("/geocoder/v2/?" + paramsStr + "rbCHDhb9fARPyxGVDhLSifx7IO4vWk"); // 对上面wholeStr再作utf8编码
String tempStr = URLEncoder.encode(wholeStr, "UTF-8"); // 调用下面的MD5方法得到sn签名值d
String sn = MD5(tempStr); // 算得sn后发送get请求
HttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet( "http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=XWnIC5k1cguL71ClpinbhmozUsBWY4Xr&sn=" + sn);
HttpResponse response = client.execute(httpget);
InputStream is = response.getEntity().getContent();
String result = inStream2String(is);
// 打印响应内容
System.out.println(result);
} public void testPost() throws Exception {
/**
* 以http://api.map.baidu.com/geodata/v3/geotable/create创建表为例
*/
LinkedHashMap<String, String> paramsMap = new LinkedHashMap<String, String>();
paramsMap.put("geotype", "1");
paramsMap.put("ak", "yourak");
paramsMap.put("name", "geotable80");
paramsMap.put("is_published", "1"); // post请求是按字母序填充,对上面的paramsMap按key的字母序排列
Map<String, String> treeMap = new TreeMap<String, String>(paramsMap);
String paramsStr = toQueryString(treeMap); String wholeStr = new String("/geodata/v3/geotable/create?" + paramsStr
+ "yoursk");
String tempStr = URLEncoder.encode(wholeStr, "UTF-8");
// 调用下面的MD5方法得到sn签名值
String sn = MD5(tempStr); HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(
"http://api.map.baidu.com/geodata/v3/geotable/create");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("geotype", "1"));
params.add(new BasicNameValuePair("ak", "yourak"));
params.add(new BasicNameValuePair("name", "geotable80"));
params.add(new BasicNameValuePair("is_published", "1"));
params.add(new BasicNameValuePair("sn", sn));
HttpEntity formEntity = new UrlEncodedFormEntity(params);
post.setEntity(formEntity);
HttpResponse response = client.execute(post);
InputStream is = response.getEntity().getContent();
String result = inStream2String(is);
// 打印响应内容
System.out.println(result);
} // 对Map内所有value作utf8编码,拼接返回结果
public String toQueryString(Map<?, ?> data)
throws UnsupportedEncodingException, URIException {
StringBuffer queryString = new StringBuffer();
for (Entry<?, ?> pair : data.entrySet()) {
queryString.append(pair.getKey() + "=");
// queryString.append(URLEncoder.encode((String) pair.getValue(),
// "UTF-8") + "&");
queryString.append(URIUtil.encodeQuery((String) pair.getValue(),
"UTF-8") + "&");
}
if (queryString.length() > 0) {
queryString.deleteCharAt(queryString.length() - 1);
}
return queryString.toString();
} // MD5计算方法,调用了MessageDigest库函数,并把byte数组结果转换成16进制
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest
.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)
.substring(1, 3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
} // 将输入流转换成字符串
private static String inStream2String(InputStream is) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while ((len = is.read(buf)) != -1) {
baos.write(buf, 0, len);
}
return new String(baos.toByteArray(), "UTF-8");
}
}
4.总结:总之,我们在调用平台的接口时,一定要注意参数问题,不可再不知道参数的情况下胡乱的粘贴复制,这样就很难保证代码的成功率了。
关于java后台接入百度地图返回参数为{"status":211,"message":"APP SN校验失败"}的解决方法的更多相关文章
- c# 百度地图api APP SN校验失败
在使用c#调用百度地图Web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略) 1.首先获取ak与sk,这个两个东西可以从控制台中获取到 2.在这个地址:sn签名算法,里面 ...
- 百度地图API提示"230错误 APP Scode校验失败"
笔者近2天在 Android Studio上玩了一下百度地图,碰到了常见的"230错误 APP Scode校验失败",下面我来介绍一下具体的解决办法. 1.在andriodstud ...
- MUI框架-11-MUI前端 +php后台接入百度文字识别API
MUI框架-11-MUI前端 +php后台接入百度文字识别API 这里后台不止一种,Python,Java,PHP,Node,C++,C# 都可以 这里使用的是 php 来介绍,已经解决所有问题,因为 ...
- vue项目接入百度地图
方法一 :使用第三方工具 vue-baidu-map 安装命令: yarn add vue-baidu-map --save 文档地址:https://dafrok.github.io/vue-bai ...
- ol 接入百度地图
ol5 如何接入百度地图,网上的资料很多,但是大多都有问题,在级别放大时,地图发生扭曲.为此注重研究了下ol5 接入百度地图的方法. 首先明确以下问题: 百度地图的投影是3857. 百度地图的分辨率和 ...
- 使用html5获取当前手机的经纬度,并接入百度地图API,查询出当前位置
最近项目需要,稍微研究一下html5获取当前地理位置的问题. 获取当前位置的经纬度很简单,一句代码就搞定 navigator.geolocation.getCurrentPosition(functi ...
- 160518、java中使用百度地图(超级简单)
第一步:导入如下内容,红色的部分需要申请(个人通过手机号就可以申请) <script type="text/javascript" src="http://api. ...
- 百度地图与融云的“冲突”(APP的.so手机架构目录,与Library的.so的手机架构目录冲突)
在项目引进融云的IMkit时,总是报百度地图的错误,最开始以为是65535的错误,然后试着去改下百度地图,错误原因是在IMKit里面,它的.so库有这么几个目录 而我的app的libs里面的百度地图的 ...
- java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to net.sf.json.JSONObject的解决方法
报错情况已经说明了,在百度查了好几个解决方法,这里总结一下: 首先:加一个判断是否为空,再做操作 // 得到json串 String jsonString = UtilPOSTGET.UPost(FO ...
随机推荐
- codeforces 之 Little Pigs and Wolves
B-Little Pigs and Wolvestime limit per test2 secondsmemory limit per test256 megabytesinputstandard ...
- 8--json交互
8.1 为什么要进行json数据交互 json数据格式在接口调用.html页面中较常用,json格式较简单,解析较方便. 比如:webservice接口,传输json数据. 8.2 spri ...
- BZOJ 1612 [Usaco2008 Jan]Cow Contest奶牛的比赛:floyd传递闭包
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1612 题意: 有n头牛比赛. 告诉你m组(a,b),表示牛a成绩比牛b高. 保证排名没有并 ...
- 迁移学习——使用Tensorflow和VGG16预训模型进行预测
使用Tensorflow和VGG16预训模型进行预测 from:https://zhuanlan.zhihu.com/p/28997549 fast.ai的入门教程中使用了kaggle: dogs ...
- python-unittest单元测试框架
可以理解为是已经帮我们封装好的东东,可以完成执行用例\预期与实际结果的对比等. import unittest 封装好的单元测试框架,可以直接使用 编写的测试类的继承unittest.TestCase ...
- Java微信公众平台开发_03_消息管理之被动回复消息
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...
- vim 编辑器IDE版
wget https://raw.github.com/ma6174/vim/master/setup.sh -O ma6174_vim_setup.sh && bash ma6174 ...
- 关于Django ORM filter方法小结
django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...
- [转]从onload和DOMContentLoaded谈起
这篇文章是对这一两年内几篇dom ready文章的汇总(文章的最后会标注参考文章),因为浏览器进化的关系,可能他们现在的行为与本文所谈到的一些行为不相符.我也并没有一一去验证,所以本文仅供参考,在具体 ...
- poj3067Japan——树状数组查找逆序对
题目:http://poj.org/problem?id=3067 利用树状数组查找逆序对. 代码如下: #include<iostream> #include<cstdio> ...