1. import java.io.ByteArrayOutputStream;
  2. import java.io.InputStream;
  3. import java.io.UnsupportedEncodingException;
  4. import java.net.URLEncoder;
  5. import java.util.ArrayList;
  6. import java.util.LinkedHashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Map.Entry;
  10. import java.util.TreeMap;
  11. //需要httpclient-x.x.jar,httpcore-x.x.jar,commons-logging-x.x.jar,commons-httpclient-x.x.jar,commons-codec-x.x.jar包发http请求
  12. import org.apache.commons.httpclient.URIException;
  13. import org.apache.commons.httpclient.util.URIUtil;
  14. import org.apache.http.HttpEntity;
  15. import org.apache.http.HttpResponse;
  16. import org.apache.http.NameValuePair;
  17. import org.apache.http.client.HttpClient;
  18. import org.apache.http.client.entity.UrlEncodedFormEntity;
  19. import org.apache.http.client.methods.HttpGet;
  20. import org.apache.http.client.methods.HttpPost;
  21. import org.apache.http.impl.client.DefaultHttpClient;
  22. import org.apache.http.message.BasicNameValuePair;
  23. public class SnTest {
  24. public static void main(String[] args) throws Exception {
  25. SnTest snTest = new SnTest();
  26. snTest.testGet();
  27. snTest.testPost();
  28. }
  29. public void testGet() throws Exception {
  30. /**
  31. * 以http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak为例
  32. * ak设置了sn校验不能直接使用必须在url最后附上sn值,get请求计算sn跟url中参数对出现顺序有关,需按序填充paramsMap,
  33. * post请求是按字母序填充,具体参照testPost()
  34. */
  35. Map paramsMap = new LinkedHashMap<String, String>();
  36. paramsMap.put("address", "百度大厦");
  37. paramsMap.put("output", "json");
  38. paramsMap.put("ak", "yourak");
  39. // 调用下面的toQueryString方法,对paramsMap内所有value作utf8编码
  40. String paramsStr = toQueryString(paramsMap);
  41. // 对paramsStr前面拼接上/geocoder/v2/?,后面直接拼接yoursk
  42. String wholeStr = new String("/geocoder/v2/?" + paramsStr + "yoursk");
  43. // 对上面wholeStr再作utf8编码
  44. String tempStr = URLEncoder.encode(wholeStr, "UTF-8");
  45. // 调用下面的MD5方法得到sn签名值
  46. String sn = MD5(tempStr);
  47. // 算得sn后发送get请求
  48. HttpClient client = new DefaultHttpClient();
  49. HttpGet httpget = new HttpGet(
  50. "http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak&sn="
  51. + sn);
  52. HttpResponse response = client.execute(httpget);
  53. InputStream is = response.getEntity().getContent();
  54. String result = inStream2String(is);
  55. // 打印响应内容
  56. System.out.println(result);
  57. }
  58. public void testPost() throws Exception {
  59. /**
  60. * 以http://api.map.baidu.com/geodata/v3/geotable/create创建表为例
  61. */
  62. LinkedHashMap<String, String> paramsMap = new LinkedHashMap<String, String>();
  63. paramsMap.put("geotype", "1");
  64. paramsMap.put("ak", "yourak");
  65. paramsMap.put("name", "geotable80");
  66. paramsMap.put("is_published", "1");
  67. // post请求是按字母序填充,对上面的paramsMap按key的字母序排列
  68. Map<String, String> treeMap = new TreeMap<String, String>(paramsMap);
  69. String paramsStr = toQueryString(treeMap);
  70. String wholeStr = new String("/geodata/v3/geotable/create?" + paramsStr
  71. + "yoursk");
  72. String tempStr = URLEncoder.encode(wholeStr, "UTF-8");
  73. // 调用下面的MD5方法得到sn签名值
  74. String sn = MD5(tempStr);
  75. HttpClient client = new DefaultHttpClient();
  76. HttpPost post = new HttpPost(
  77. "http://api.map.baidu.com/geodata/v3/geotable/create");
  78. List<NameValuePair> params = new ArrayList<NameValuePair>();
  79. params.add(new BasicNameValuePair("geotype", "1"));
  80. params.add(new BasicNameValuePair("ak", "yourak"));
  81. params.add(new BasicNameValuePair("name", "geotable80"));
  82. params.add(new BasicNameValuePair("is_published", "1"));
  83. params.add(new BasicNameValuePair("sn", sn));
  84. HttpEntity formEntity = new UrlEncodedFormEntity(params);
  85. post.setEntity(formEntity);
  86. HttpResponse response = client.execute(post);
  87. InputStream is = response.getEntity().getContent();
  88. String result = inStream2String(is);
  89. // 打印响应内容
  90. System.out.println(result);
  91. }
  92. // 对Map内所有value作utf8编码,拼接返回结果
  93. public String toQueryString(Map<?, ?> data)
  94. throws UnsupportedEncodingException, URIException {
  95. StringBuffer queryString = new StringBuffer();
  96. for (Entry<?, ?> pair : data.entrySet()) {
  97. queryString.append(pair.getKey() + "=");
  98. // queryString.append(URLEncoder.encode((String) pair.getValue(),
  99. // "UTF-8") + "&");
  100. queryString.append(URIUtil.encodeQuery((String) pair.getValue(),
  101. "UTF-8") + "&");
  102. }
  103. if (queryString.length() > 0) {
  104. queryString.deleteCharAt(queryString.length() - 1);
  105. }
  106. return queryString.toString();
  107. }
  108. // MD5计算方法,调用了MessageDigest库函数,并把byte数组结果转换成16进制
  109. public String MD5(String md5) {
  110. try {
  111. java.security.MessageDigest md = java.security.MessageDigest
  112. .getInstance("MD5");
  113. byte[] array = md.digest(md5.getBytes());
  114. StringBuffer sb = new StringBuffer();
  115. for (int i = 0; i < array.length; ++i) {
  116. sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)
  117. .substring(1, 3));
  118. }
  119. return sb.toString();
  120. } catch (java.security.NoSuchAlgorithmException e) {
  121. }
  122. return null;
  123. }
  124. // 将输入流转换成字符串
  125. private static String inStream2String(InputStream is) throws Exception {
  126. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  127. byte[] buf = new byte[1024];
  128. int len = -1;
  129. while ((len = is.read(buf)) != -1) {
  130. baos.write(buf, 0, len);
  131. }
  132. return new String(baos.toByteArray(), "UTF-8");
  133. }
  134. }

演示get、post请求如何算sn,算得sn如何使用的更多相关文章

  1. 关于java后台接入百度地图返回参数为{"status":211,"message":"APP SN校验失败"}的解决方法

    1.关于百度地图,天气预报,微信公众平台等一系列权威机构java接入的认识: a.首先要认识到的是这些信息都属于外部接口,我们在进行接入的时候一定要注意到这些接口的参数设置,稍微一不留神就会出现接入失 ...

  2. Nginx请求连接限制

    目录 Nginx的请求限制 HTTP协议的连接与请求 连接限制 配置示例 做个演示: 请求限制 配置示例 基本指令 limit_req_zone limit_req zone 做个演示: Nginx的 ...

  3. ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

    Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称,如下面 ...

  4. 3G数据请求

    //  该类负责发送2G/3G Http请求的数据 #import <Foundation/Foundation.h> #import "ASIHTTPRequest.h&quo ...

  5. GET/POST请求的使用《极客学院 --AFNetworking 2.x 网络解析详解--2》学习笔记

    AFNetworking是开源代码排名第一的开源库.  GET请求的请求正文 一般都是明文显示的,携带的数据量小. POST用于处理复杂的业务,并不用明文的请求,其实POST请求可以携带更多的参数,只 ...

  6. Server是如何完成针对请求的监听、接收与响应1

    Server是如何完成针对请求的监听.接收与响应的[上] Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实 ...

  7. jQuery Ajax封装(附带加载提示和请求结果提示模版)

    1.创建HTML文件(demo) <!doctype html> <html lang="en"> <head> <meta charse ...

  8. 开源个.NetCore写的 - 并发请求工具PressureTool

    本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等: 对于没有遇到过或者不可能线上来 ...

  9. Kafka技术内幕 读书笔记之(六) 存储层——服务端处理读写请求、分区与副本

    如下图中分区到 日 志的虚线表示 : 业务逻辑层的一个分区对应物理存储层的一个日志 . 消息集到数据文件的虚线表示 : 客户端发送的消息集最终会写入日志分段对应的数据文件,存储到Kafka的消息代理节 ...

随机推荐

  1. Github优秀java项目集合(中文版) - 涉及java所有的知识体系

    Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...

  2. 【开源分享:入门到精通ASP.NET MVC+EF6+Bootstrap】从这里开始,一起搭框架(1)开篇介绍

    框架简介 这几年一直在做ASP.NET开发,几年前做项目都是老老实实一行行的写代码,后来发现那些高手基本都会有自己积累起来的代码库,现在称之为开发框架,基础代码不用再去堆,主要精力可以集中在业务逻辑实 ...

  3. Jquery 页面首次加载方式

    $(document).ready(function(){ alert("111"); }); $(function(){ alert("222"); }); ...

  4. 让计算机崩溃的python代码,求共同分析

    在现在的异常机制处理的比较完善的编码系统里面,让计算机完全崩溃无法操作的代码还是不多的.今天就无意运行到这段python代码,运行完,计算机直接崩溃,任务管理器都无法调用,任何键都用不了,只能强行电源 ...

  5. Eclipse利用Maven2搭建SpringMVC框架的Web工程

    一.准备工作: 下载apache-maven--> 配置Maven_home -->下载Eclipse Maven插件 二.新建工程:   选择新建Maven Project  arche ...

  6. 简单Ztree的实现————不连接数据库版

    Ztree可以去官网去下载相应的版本和API,我这里就简单的介绍下它的实现以及因为Ztree的小例子印发的Js问题,稍后我会在博客中写JS的异步问题, 我这里用的是MVC4.0,好了正文开始,上代码 ...

  7. ElasticSearch入门系列(五)数据

    序言:无论程序如何写,最终都是为了组织数据为我们服务.在实际应用中,并不是所有相同类型的实体的看起来都是一样的.传统上我们使用行和列将数据存储在关系型数据库中相当于使用电子表格,这种固定的存储方式导致 ...

  8. Docker总结(图片打开略慢请知晓)

  9. parse date receiving from mvc jsonresult

    if we received data like this: ,"Date":"\/Date(1410969600000)\/", we can parse i ...

  10. Volley用法

    RequestQueue requestQueue = Volley.newRequestQueue(this); JsonObjectRequest jsonObjectRequest = new ...