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. Web Worker 是什么鬼?

    前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...

  2. 【前端也要学点算法】快速排序的JavaScript实现

    作为算法目录下的第一篇博文,快速排序那是再合适不过了.作为最基本最经典的算法之一,我觉得每个程序员都应该熟悉并且掌握它,而不是只会调用库函数,知其然而不知其所以然. 排序算法有10种左右(或许更多), ...

  3. bootstrap - typeahead自动补全插件

    $('#Sale').typeahead({ ajax: { url: '@Url.Action("../Contract/GetSale")', //timeout: 300, ...

  4. ContentProvider详解

    作用:把一个App中的数据库通过Url的形式共享出来,供其他App使用. 首先在App1中创建一个数据库,用SQLiteOpenHelper public class MyOpenHelper ext ...

  5. MySQL中的insert ignore into, replace into等的一些用法总结

    在MySQL中进行条件插入数据时,可能会用到以下语句,现小结一下.我们先建一个简单的表来作为测试: CREATE TABLE `books` ( `id` INT(11) NOT NULL AUTO_ ...

  6. 网上找到的一个jquery版网页换肤特效

    这个跟我之前在锋利的JQuery那本书里看到的那个一模一样. <!DOCTYPE html> <html> <head> <meta name="& ...

  7. “CEPH浅析”系列之六——CEPH与OPENSTACK

    在 <"Ceph浅析"系列之二--Ceph概况>中即已提到,关注Ceph的原因之一,就是OpenStack社区对于Ceph的重视.因此,本文将对Ceph在OpenSta ...

  8. [转]FastJSON通过SerializeFilter定制序列化

    原文地址:https://github.com/alibaba/fastjson/wiki/SerializeFilter 简介 SerializeFilter是通过编程扩展的方式定制序列化.fast ...

  9. 【BZOJ 4456】【UOJ #184】【ZJOI 2016】旅行者

    http://www.lydsy.com/JudgeOnline/problem.php?id=4456 http://uoj.ac/problem/184 参考(抄)的晨爷的题解(代码) 对矩形进行 ...

  10. 2010-2014总结 ____V_V____ hello-world

    .caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table ...