最近在跟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...
String deString = URLDecoder.decode(vString, "UTF-8"); ``` **注意:** - 解码时使用的字符集需要与前端编码时保持一致,例如这里使用的是`UTF-8`。 - 在实际开发中,需要注意处理可能出现的异常,如`...
例如,当服务器接收到 `"za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g=="` 这样的编码参数时,可以使用 `URLDecoder.decode(param, "utf-8")` 将其解码,从而得到正确的值。 需要注意的是,`URLEncoder...
此外,还展示了如何使用`URLDecoder.decode`方法来解码UTF-8编码的URL参数。 #### 四、总结 通过以上分析,我们可以看到,在Java中进行字符编码转换是一项基本而重要的任务。理解并掌握不同的编码方式及其转换方法...
在Java中,对应的函数是`java.net.URLDecoder.decode()`和`java.net.URLEncoder.encode()`。 在WindowsFormsApplication1这个文件名中,我们可以推测这是一个基于.NET Framework开发的Windows桌面应用程序,它可能...
多文件上传例子,彻底解决中文乱码问题了。...4、适当的时候,在jsp里用java.net.URLDecoder.decode(request.getParameter("str"),"UTF-8")。 5、最容易忽略的是使用"":value="<%=paraFiles%>",一定要有引号。
params = java.net.URLDecoder.decode(paramsTrans , "UTF-8"); 通过这种方法,我们可以确保中文数据的正确性,避免乱码问题的出现。 Jquery serialize() 方法的中文乱码问题可以通过 decodeURIComponent 方法和两...
String decodedKeywords = URLDecoder.decode(encodedKeywords, "UTF-8"); ``` 在上面的代码中,我们使用URLDecoder.decode()方法将编码后的字符串解码为原始字符串"中文关键词"。 TOMCAT服务器编码设置 除了在...
banner = URLDecoder.decode(banner, "utf-8"); pwd = URLDecoder.decode(pwd, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return SUCCESS; } ``` 服务器端使用了`...
name = URLDecoder.decode(name, "UTF-8"); ``` 总结起来,当遇到"java.io.CharConversionException: isHexDigit"异常时,应该检查前端传递的URL参数是否正确编码,并确保在服务器端使用正确的解码方法和字符集。...
String strUTF8 = URLDecoder.decode(str, "UTF-8"); System.out.println(strUTF8); // 输出解码后的原始字符串 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } ``` 在这个例子中,...
(1)使用java.net.URLEncoder.encode("xxxx",“utf-8")和java.net.URLDecoder.decode("xxxx",“utf-8")。 (2)使用encodeURI(“xxxx”)和java.net.URLDecoder.decode("xxxx",“utf-8")。 这两种转码方式是很好用...
使用非常简单 ---------------------------------------- HttpServletRequest request = ... msg = Translate.execute(URLDecoder.decode(q, "utf-8"), getLan(sourceLan), getLan(targetLan)); return SUCCESS;
在服务器端,使用`URLDecoder.decode(name, "UTF-8")` 进行解码。 2. **Java服务器端处理**: - 在Java中,当从URL获取参数时,`HttpServletRequest.getParameter()` 默认使用ISO-8859-1编码,这可能导致中文乱码...
String decodedStr = URLDecoder.decode("Hello%20World", "UTF-8"); System.out.println(decodedStr); // 输出: Hello World } catch (UnsupportedEncodingException e) { e.printStackTrace(); } ``` - **...
`UrlEncoder`和`UrlDecoder`接口提供了URL编码和解码的实现,确保URL的正确传输。 4. **语音编码**:Apache Commons Codec还支持电话号码的E.164格式,这是一种国际电话号码的标准格式。`PhoneticEncoder`类提供了...
String province = URLDecoder.decode(request.getParameter("site.province"), "UTF-8"); String city = URLDecoder.decode(request.getParameter("site.city"), "UTF-8"); ``` 通过这种方式,客户端和服务器端...
由于`request.getParameter`方法本身不直接支持指定字符编码,因此需要使用`URLDecoder.decode`方法对参数字符串进行解码,指定"utf-8"字符集,以保证数据能够正确解析。 另外,当使用Base64进行加密传输时,因为...
String keyVal = URLDecoder.decode(ServletActionContext.getRequest().getParameter("key"), "utf-8"); ``` - `ServletActionContext.getRequest()`用于获取当前HttpServletRequest对象,从而可以从中获取请求...