最近在跟Asp.net端调接口,产品接口里面有个上传产品头像的功能。Asp.net端需要把上传的图片流重新用Apache Base64编码,服务端使用base64解码成byte输入流上传到Windows azure云端就可以了。在今天之前小檀的接口都是正确的,今天重新再走了一下流程发现图片上传到云端后打不开。小檀走了一下本地httpclient请求模拟了一下,无果。
作为一个程序员,bug太多他不会哭,当他调了一上午的代码发现罪魁祸首是一个空格,他就想泪奔了。废话不多说,现在开始说正文。
在公司崔哥的帮助下,发现原来是这行代码出了问题。代码如下:
public static JSONObject buffer(HttpServletRequest request) { JSONObject checkInfo = null; try { BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8")); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } // 将资料解码 String reqBody = sb.toString(); //reqBody = URLDecoder.decode(reqBody, "utf-8"); checkInfo = JSONObject.parseObject(reqBody); } catch (Exception e) { e.printStackTrace(); } return checkInfo; }
对的,就是这行被注释掉的代码。随便百度一下就知道,通过urlencode转码后的字符串,需要通过UrlDecode进行解码。这个必须一致,所以秒懂了!所以如果想保留这行代码,那么客户端http request body必须要使用UrlEncoder转码。反之都不要!下面分享一下我的httpclient4.x post的封装代码:
// 发送post请求,返回结果response
//I.使用StringEntity组织参数流,虽然不推荐了,但是很好用
public static HttpResponse getResponseByPostWithStringEntity(String postUrl, Map<String, Object> paramsMap) { HttpResponse httpResponse = null; StringEntity entity = null; try { if (paramsMap != null && StringUtils.isNotBlank(postUrl)) { entity = new StringEntity(JSON.toJSONString(paramsMap),MIME_TYPE, CONTENT_CHARSET); HttpPost httpPost = new HttpPost(postUrl); // 为HttpPost设置实体数据 httpPost.setEntity(entity); httpResponse = httpclient.execute(httpPost); } } catch (Exception e) { e.printStackTrace(); } return httpResponse; }
//发送post请求,返回结果response
//II. urlEncode httpclient目前版本极力推荐(备注:客户端重新编码后,服务器端必须解码)
public static HttpResponse getResponseByPostWithUrlEncoded(String postUrl, Map<String, Object> paramsMap) { HttpResponse httpResponse = null; UrlEncodedFormEntity entity = null;// 参数流 List<NameValuePair> nameValuePairArrayList = new ArrayList<NameValuePair>(); try { if (paramsMap != null && !paramsMap.isEmpty() && StringUtils.isNotBlank(postUrl)) { // 将传过来的参数填充到List<NameValuePair>中 for (Map.Entry<String, Object> entry : paramsMap.entrySet()) { nameValuePairArrayList.add(new BasicNameValuePair(entry.getKey(), entry.getValue() != null ? entry.getValue() .toString() : "")); } entity = new UrlEncodedFormEntity(nameValuePairArrayList, CONTENT_CHARSET); HttpPost httpPost = new HttpPost(postUrl); // 为HttpPost设置实体数据 httpPost.setEntity(entity); httpResponse = httpclient.execute(httpPost); } } catch (Exception e) { e.printStackTrace(); } return httpResponse; }
从这个错误深刻发现,沟通应该到细节,要清楚自己的程序里面每行代码的作用和意义!
相关推荐
如果不想在url中看到有明文,比如http://localhost:8080/template_1/login.action?user=张三 可以使用js的encodeURI的URLDecoder.decode一起使用一起来把url加密下 (1)JS在页面上把数据var val = encodeURI...
JS的encodeURI和java的URLDecoder.decode使用介绍.docx
主要给大家介绍了关于java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
多文件上传例子,彻底解决中文乱码问题了。...4、适当的时候,在jsp里用java.net.URLDecoder.decode(request.getParameter("str"),"UTF-8")。 5、最容易忽略的是使用"":value="<%=paraFiles%>",一定要有引号。
使用非常简单 ---------------------------------------- HttpServletRequest request = ... msg = Translate.execute(URLDecoder.decode(q, "utf-8"), getLan(sourceLan), getLan(targetLan)); return SUCCESS;
可以写任意java代码 ...Cookie[]cookies=request.getCookies(); Stringusername=""; if(cookies!=null){ for(Cookiec:cookies){ if("remname".equals(c.getName...username=URLDecoder.decode(username,"utf-8"); } } } %>
在页面的url中使用encodeURI(encodeURI(中文)),对中文进行编码,并在服务器的java程序中使用URLDecoder.decode(中文, “UTF-8”)进行解码即可; 如果url中需要传递+、#、?等特殊符号,可以使用encodeURIComponent...
str = URLDecoder.decode(str, "utf-8"); File conf = new File(str); SAXReader reader = new SAXReader(); Document document = reader.read(conf); Element root = document.getRootElement(); ...
Android UTF-8转码实例详解 在项目中可能会遇到url中有中文的情况,这个时候我们可能需要对url进行编码 mport java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; ...
本文用C++来实现UrlEncode!
extraParams: {q:function(){return encodeURI(encodeURI($(‘#keyword’).val()))}} 这里同样也要解码两次 代码如下: String key = URLDecoder.decode(URLDecoder.decode(q,”UTF-8″),”tuf-8″);
在服务器端/后台/后台程序中通过指定的编码方式将十六进制的数据还原:String afterConvertChinese=URLDecoder.decode("从页面上获取的中文信息","编码方式(该处的编 码方式必须和页面中的一样)");
很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码
网址编码解码,jQuery版Url.encode,Url.decode,Url.parse,一个来自jQuery的URL Decoder解码、编码插件,为你的URL安全定义一道安全防线,示例文件本身就是一个值得学习的实例,自带的示例将告诉你如何使用这款URL...
一、客户端先进行编码,服务端再解码。...String name = URLDecoder.decode(names, "UTF-8"); 注意:必须用encodeURIComponent编码两次。 二、在 tomcat 服务端指定编码格式为 UTF-8 利用方式一虽然可以解决
URLEncoder.encode(URLDecoder.decode(url,"iso-8859-1"), "iso-8859-1"); session.setAttribute("redirectUrl",url); } else{ session.setAttribute("redirectUrl", request.getRequestURL() .toString());...
通过URLEncoder.encode加密地址栏url上得中文字符, 并可通过java.net.URLDecoder.decode(str, charset)解密中文
解码: 代码如下:java.net.URLDecoder.decode((String)request.getParameter(“tcontent”), “UTF-8”); 例a.jsp源代码 代码如下:<%@ page contentType=”text/html; charset=gb2312″ language=”java” ...
解码:java.net.URLDecoder.decode((String)request.getParameter(“tcontent”), “UTF-8”); 例 a.jsp源代码 代码如下:<%@ page contentType=”text/html; charset=gb2312″ language=”java” import=”...