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. js 数组去重

    这是一道常见的面试题,最近在做[搜索历史记录]功能也用到,开始用了 indexOf 方法,该方法在 ECMA5才有支持,对于 IE8- 就不支持了. 我们可以自己写一个函数(Array对象的方法都是定 ...

  2. 深入grootJs(进阶教程)

    深入grootJs 这篇教程的原则是把grootJs原理讲透,主要真正理解了原理才能用起来随心所欲 mvvm模式简介 grootJs的vm结构 扫描函数sweep 垃圾回收的原理 加载器中的预编 ,控 ...

  3. Spring Boot 连接MySql数据库

    Spring Boot 以后也许会成为入门Spring的首选! 记一下Spring Boot 成功连接Mysql数据库的方法步骤! 一.新建Maven工程,不全Maven所需文件夹,在pom.xml引 ...

  4. 曾经post为何只能通过form来提交

    当我们web程序的前台,需要有数据向后台发送时候,我们第一时间想到的就是,给我们所需要提交的用户名,密码之类的数据封装到一个<form>表单里面去,而封装完毕之后,我们需要给form的提交 ...

  5. PHP -- 上传文件接口编写 及 iOS -- 端上传图片AF实现

    PHP 上传文件接口: //保存图片 $json_result ['status'] = 0; $path = 'upfile'; $json_result ['status'] = 0; $json ...

  6. 1111MySQL配置参数详解

    http://blog.csdn.net/wlzx120/article/details/52301383 # 以下选项会被MySQL客户端应用读取. # 注意只有MySQL附带的客户端应用程序保证可 ...

  7. css3实现的3中loading动画效果

    一.css3中animation动画各种属性详解: animation Value:     [<animation-name> || <animation-duration> ...

  8. [Bundling and Minification ] 一、如何绑定

    绑定和压缩(缩小)是ASP.NET 4.5出现的用来提高程序性能的两个重要的技术.绑定(Bundling)是将多个文件合并为一个文件,压缩(Minification)主要是将文件缩小,如Js .CSS ...

  9. 【BZOJ 1568】【JSOI 2008】Blue Mary开公司

    经典的splay维护凸壳,但是看了看zky学长的题解最后决定写线段树维护标记永久化. Round1考到了这个之后一直没有理解标记永久化,CTSC也因为自己的缺陷丢掉了一些部分分,so sad 看来以后 ...

  10. 【BZOJ 2648】SJY摆棋子 & 【BZOJ 2716】【Violet 3】天使玩偶

    KDTree模板,双倍经验啦啦啦- #include<cstdio> #include<cstring> #include<algorithm> #define r ...