关于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 ...
随机推荐
- JAVA- JSP中解决无法在Cookie当中保存中文字符的问题
因为cookie的值是ASCII字符,不能直接把自定义cookie的值直接赋值为中文,但是要实现这个功能,还是有方法的. 1.java中已经给我们提供了方法,此时只需要导入该包就行 <%@ pa ...
- java 基础 - 反转字符串
反转字符串 public class Main { public static void main(String[] args) { String newStr= strReverseWithArra ...
- 如何配置OpenFire上JVM的内存(Memory)
目前OpenFire在Linux下有2种安装方式, 网上对于第二种Linux安装方式下如何配置JVM内存(Memory)并没有描述: tar -xzvf openfire_3_0_0.tar.gzmv ...
- rust borrow and move
extern crate core; #[deriving(Show)] struct Foo { f : Box<int> } fn main(){ let mut a = Foo {f ...
- hdu-5781 ATM Mechine(dp+概率期望)
题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- Python: Neural Networks
这是用Python实现的Neural Networks, 基于Python 2.7.9, numpy, matplotlib. 代码来源于斯坦福大学的课程: http://cs231n.github. ...
- CodeForces - 884F :Anti-Palindromize(贪心&费用流)
A string a of length m is called antipalindromic iff m is even, and for each i (1 ≤ i ≤ m) ai ≠ am - ...
- kettle及数据库导数_20160920
一.kettle是什么. Kettle是一款国外开源的ETL( Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载 ...
- 洛谷 P1496 火烧赤壁
题目描述 曹操平定北方以后,公元208年,率领大军南下,进攻刘表.他的人马还没有到荆州,刘表已经病死.他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了. 孙权任命周瑜为都督,拨给他三万水军,叫他同 ...
- 【Python】String 字符串
1. split() split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 split()方法语法:str.split(str="" ...