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

1 //演示get、post请求如何算sn,算得sn如何使用

2 importjava.io.ByteArrayOutputStream;3 importjava.io.InputStream;4 importjava.io.UnsupportedEncodingException;5 importjava.net.URLEncoder;6 importjava.util.ArrayList;7 importjava.util.LinkedHashMap;8 importjava.util.List;9 importjava.util.Map;10 importjava.util.Map.Entry;11 importjava.util.TreeMap;12

13 //需要httpclient-x.x.jar,httpcore-x.x.jar,commons-logging-x.x.jar,commons-httpclient-x.x.jar,commons-codec-x.x.jar包发http请求

14 importorg.apache.commons.httpclient.URIException;15 importorg.apache.commons.httpclient.util.URIUtil;16 importorg.apache.http.HttpEntity;17 importorg.apache.http.HttpResponse;18 importorg.apache.http.NameValuePair;19 importorg.apache.http.client.HttpClient;20 importorg.apache.http.client.entity.UrlEncodedFormEntity;21 importorg.apache.http.client.methods.HttpGet;22 importorg.apache.http.client.methods.HttpPost;23 importorg.apache.http.impl.client.DefaultHttpClient;24 importorg.apache.http.message.BasicNameValuePair;25

26 @SuppressWarnings("deprecation")27 public classtest02 {28 public static void main(String[] args) throwsException {29 test02 test02 = newtest02();30 test02.testGet();31 test02.testPost();32 }33

34 @SuppressWarnings("all")35 public void testGet() throwsException {36 /**

37 * 以http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak为例38 * ak设置了sn校验不能直接使用必须在url最后附上sn值,get请求计算sn跟url中参数对出现顺序有关,需按序填充paramsMap,39 * post请求是按字母序填充,具体参照testPost()40 */

41 Map paramsMap = new LinkedHashMap();42 paramsMap.put("address", "百度大厦");43 paramsMap.put("output", "json");44 paramsMap.put("ak", "XWnIC5k1cguL71ClpinbhmozUsBWY4Xr");45

46 //调用下面的toQueryString方法,对paramsMap内所有value作utf8编码

47 String paramsStr =toQueryString(paramsMap);48

49 //对paramsStr前面拼接上/geocoder/v2/?,后面直接拼接yoursk

50 String wholeStr = new String("/geocoder/v2/?" + paramsStr + "rbCHDhb9fARPyxGVDhLSifx7IO4vWk");51

52 //对上面wholeStr再作utf8编码

53 String tempStr = URLEncoder.encode(wholeStr, "UTF-8");54

55 //调用下面的MD5方法得到sn签名值d

56 String sn =MD5(tempStr);57

58 //算得sn后发送get请求

59 HttpClient client = newDefaultHttpClient();60 HttpGet httpget = new HttpGet( "http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=XWnIC5k1cguL71ClpinbhmozUsBWY4Xr&sn=" +sn);61 HttpResponse response =client.execute(httpget);62 InputStream is =response.getEntity().getContent();63 String result =inStream2String(is);64 //打印响应内容

65 System.out.println(result);66 }67

68 public void testPost() throwsException {69 /**

70 * 以http://api.map.baidu.com/geodata/v3/geotable/create创建表为例71 */

72 LinkedHashMap paramsMap = new LinkedHashMap();73 paramsMap.put("geotype", "1");74 paramsMap.put("ak", "yourak");75 paramsMap.put("name", "geotable80");76 paramsMap.put("is_published", "1");77

78 //post请求是按字母序填充,对上面的paramsMap按key的字母序排列

79 Map treeMap = new TreeMap(paramsMap);80 String paramsStr =toQueryString(treeMap);81

82 String wholeStr = new String("/geodata/v3/geotable/create?" +paramsStr83 + "yoursk");84 String tempStr = URLEncoder.encode(wholeStr, "UTF-8");85 //调用下面的MD5方法得到sn签名值

86 String sn =MD5(tempStr);87

88 HttpClient client = newDefaultHttpClient();89 HttpPost post = newHttpPost(90 "http://api.map.baidu.com/geodata/v3/geotable/create");91 List params = new ArrayList();92 params.add(new BasicNameValuePair("geotype", "1"));93 params.add(new BasicNameValuePair("ak", "yourak"));94 params.add(new BasicNameValuePair("name", "geotable80"));95 params.add(new BasicNameValuePair("is_published", "1"));96 params.add(new BasicNameValuePair("sn", sn));97 HttpEntity formEntity = newUrlEncodedFormEntity(params);98 post.setEntity(formEntity);99 HttpResponse response =client.execute(post);100 InputStream is =response.getEntity().getContent();101 String result =inStream2String(is);102 //打印响应内容

103 System.out.println(result);104 }105

106 //对Map内所有value作utf8编码,拼接返回结果

107 public String toQueryString(Map, ?>data)108 throwsUnsupportedEncodingException, URIException {109 StringBuffer queryString = newStringBuffer();110 for (Entry, ?>pair : data.entrySet()) {111 queryString.append(pair.getKey() + "=");112 //queryString.append(URLEncoder.encode((String) pair.getValue(),113 //"UTF-8") + "&");

114 queryString.append(URIUtil.encodeQuery((String) pair.getValue(),115 "UTF-8") + "&");116 }117 if (queryString.length() > 0) {118 queryString.deleteCharAt(queryString.length() - 1);119 }120 returnqueryString.toString();121 }122

123 //MD5计算方法,调用了MessageDigest库函数,并把byte数组结果转换成16进制

124 publicString MD5(String md5) {125 try{126 java.security.MessageDigest md =java.security.MessageDigest127 .getInstance("MD5");128 byte[] array =md.digest(md5.getBytes());129 StringBuffer sb = newStringBuffer();130 for (int i = 0; i < array.length; ++i) {131 sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)132 .substring(1, 3));133 }134 returnsb.toString();135 } catch(java.security.NoSuchAlgorithmException e) {136 }137 return null;138 }139

140 //将输入流转换成字符串

141 private static String inStream2String(InputStream is) throwsException {142 ByteArrayOutputStream baos = newByteArrayOutputStream();143 byte[] buf = new byte[1024];144 int len = -1;145 while ((len = is.read(buf)) != -1) {146 baos.write(buf, 0, len);147 }148 return new String(baos.toByteArray(), "UTF-8");149 }150 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值