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. climits

    <climits>头文件定义的符号常量 CHAR_MIN  char的最小值SCHAR_MAX  signed char 最大值SCHAR_MIN   signed char 最小值UCH ...

  2. lecture16-联合模型、分层坐标系、超参数优化及本课未来的探讨

    这是HInton的第16课,也是最后一课. 一.学习一个图像和标题的联合模型 在这部分,会介绍一些最近的在学习标题和描述图片的特征向量的联合模型上面的工作.在之前的lecture中,介绍了如何从图像中 ...

  3. C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

    1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke ...

  4. js表单提交,面向对象

    一.js表单验证之后再提交 1.普通按钮onclick函数调用表单的submit()函数 <input type=button name="submit1" value=&q ...

  5. RecyclerView的使用(一)

    RecyclerView是Android5.0推出的用来替代ListView和GridView的控件. 使用RecyclerView也很简单,不过需要先引入support-v7中的RecyclerVi ...

  6. mysql的主从复制是如何实现的

    前言 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为 ...

  7. Linux vsftp配置本地用户

    主要讲的是配置本地用户, ftp现在用的也少了,一般都用ssh和svn 1. 安装ftp  yum -y install vsftpd 2. 配置 /etc/vsftpd/vsftpd.conf # ...

  8. [转] ServletContext 与application的异同

    相同:其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量.在 servlet中ServletContext就是application对象.大家只 ...

  9. struts2的核心和工作原理

    struts2的核心和工作原理 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.技术优势 Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于clien ...

  10. java中的this和super的作用和异同和C++中调用父类的构造函数

    来源于:http://www.cnblogs.com/hasse/p/5023392.html 这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ ...