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校验失败"}的解决方法的更多相关文章

  1. c# 百度地图api APP SN校验失败

    在使用c#调用百度地图Web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略) 1.首先获取ak与sk,这个两个东西可以从控制台中获取到 2.在这个地址:sn签名算法,里面 ...

  2. 百度地图API提示"230错误 APP Scode校验失败"

    笔者近2天在 Android Studio上玩了一下百度地图,碰到了常见的"230错误 APP Scode校验失败",下面我来介绍一下具体的解决办法. 1.在andriodstud ...

  3. MUI框架-11-MUI前端 +php后台接入百度文字识别API

    MUI框架-11-MUI前端 +php后台接入百度文字识别API 这里后台不止一种,Python,Java,PHP,Node,C++,C# 都可以 这里使用的是 php 来介绍,已经解决所有问题,因为 ...

  4. vue项目接入百度地图

    方法一 :使用第三方工具 vue-baidu-map 安装命令: yarn add vue-baidu-map --save 文档地址:https://dafrok.github.io/vue-bai ...

  5. ol 接入百度地图

    ol5 如何接入百度地图,网上的资料很多,但是大多都有问题,在级别放大时,地图发生扭曲.为此注重研究了下ol5 接入百度地图的方法. 首先明确以下问题: 百度地图的投影是3857. 百度地图的分辨率和 ...

  6. 使用html5获取当前手机的经纬度,并接入百度地图API,查询出当前位置

    最近项目需要,稍微研究一下html5获取当前地理位置的问题. 获取当前位置的经纬度很简单,一句代码就搞定 navigator.geolocation.getCurrentPosition(functi ...

  7. 160518、java中使用百度地图(超级简单)

    第一步:导入如下内容,红色的部分需要申请(个人通过手机号就可以申请) <script type="text/javascript" src="http://api. ...

  8. 百度地图与融云的“冲突”(APP的.so手机架构目录,与Library的.so的手机架构目录冲突)

    在项目引进融云的IMkit时,总是报百度地图的错误,最开始以为是65535的错误,然后试着去改下百度地图,错误原因是在IMKit里面,它的.so库有这么几个目录 而我的app的libs里面的百度地图的 ...

  9. java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to net.sf.json.JSONObject的解决方法

    报错情况已经说明了,在百度查了好几个解决方法,这里总结一下: 首先:加一个判断是否为空,再做操作 // 得到json串 String jsonString = UtilPOSTGET.UPost(FO ...

随机推荐

  1. matlab的数组

    1.定义:同一类型的元素的集合. 2.生成:用[]创建,元素之间用逗号或者空格隔开. 第一例: >>a=[1,2,3,4] a = 1 2 3 4 注意,取矩阵的某几列,是这样a(:,2: ...

  2. Android SDK中 tools 目录下的工具介绍

    Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator )它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的Andro ...

  3. BZOJ 1207 [HNOI2004]打鼹鼠:dp【类似最长上升子序列】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1207 题意: 有一个n*n的网格,接下来一段时间内会有m只鼹鼠出现. 第i只鼹鼠会在tim ...

  4. laravel基础课程---13、数据库基本操作2(lavarel数据库操作和tp对比)

    laravel基础课程---13.数据库基本操作2(lavarel数据库操作和tp对比) 一.总结 一句话总结: 非常非常接近:也是分为两大类,原生SQL 和 数据库链式操作 学习方法:使用时 多看手 ...

  5. 分享知识-快乐自己:SpringMVC 结合使用拦截器(判断是否用户是否已登陆)

    基础拦截器操作: 拦截器是一种AOP操作实现,那么在AOP之中用户一定不需要去关注拦截器的存在,用户只需要按照自己已经习惯的处理方式进行代码的编写即可. 首先我们先创建一个自定义的拦截器: packa ...

  6. LoadRunner监控图表与配置(三)对系统与网络资源进行监控

    1.Windows可监控的性能计数器 2.UNIX可监控的性能计数器 3.性能计数器信息说明 Windows 性能对象 计数器 数值说明 System %Total Processor Time 系统 ...

  7. 清除float浮动三种方式

    Float的作用? w3c的官方解释: Content flows down the right side of a left-floated box and down the left side o ...

  8. 关于Socket 多线程 的一篇好文章

    http://www.kegel.com/c10k.html#topIt's time for web servers to handle ten thousand clients simultane ...

  9. 对于makefile传递参数的一些问题

    makefile变量说明: 1.总控Makefile中使用“-e”参数覆盖下一层Makefile中的变量. 2.父级Makefile向子级Makefile传送变量方式:export <varia ...

  10. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...