`

由URLDecoder.decode(reqBody, "utf-8");引发的bug

    博客分类:
  • JAVA
阅读更多

     最近在跟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;

    }

   从这个错误深刻发现,沟通应该到细节,要清楚自己的程序里面每行代码的作用和意义!

   

   

分享到:
评论

相关推荐

    JS的encodeURI和java的URLDecoder.decode使用介绍

    如果不想在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

    String deString = URLDecoder.decode(vString, "UTF-8"); ``` **注意:** - 解码时使用的字符集需要与前端编码时保持一致,例如这里使用的是`UTF-8`。 - 在实际开发中,需要注意处理可能出现的异常,如`...

    java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    例如,当服务器接收到 `"za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g=="` 这样的编码参数时,可以使用 `URLDecoder.decode(param, "utf-8")` 将其解码,从而得到正确的值。 需要注意的是,`URLEncoder...

    Java 程序转码(UTF-8)

    此外,还展示了如何使用`URLDecoder.decode`方法来解码UTF-8编码的URL参数。 #### 四、总结 通过以上分析,我们可以看到,在Java中进行字符编码转换是一项基本而重要的任务。理解并掌握不同的编码方式及其转换方法...

    GB2312UTF-8字符互转

    在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="&lt;%=paraFiles%&gt;",一定要有引号。

    Jquery serialize() 中文乱码及解决方法

    params = java.net.URLDecoder.decode(paramsTrans , "UTF-8"); 通过这种方法,我们可以确保中文数据的正确性,避免乱码问题的出现。 Jquery serialize() 方法的中文乱码问题可以通过 decodeURIComponent 方法和两...

    Android客户端发送请求中文乱码问题完美解决

    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; } ``` 服务器端使用了`...

    url传值异常java.io.CharConversionException: isHexDigit

    name = URLDecoder.decode(name, "UTF-8"); ``` 总结起来,当遇到"java.io.CharConversionException: isHexDigit"异常时,应该检查前端传递的URL参数是否正确编码,并确保在服务器端使用正确的解码方法和字符集。...

    Android UTF-8转码实例详解

    String strUTF8 = URLDecoder.decode(str, "UTF-8"); System.out.println(strUTF8); // 输出解码后的原始字符串 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } ``` 在这个例子中,...

    url地址传参中文乱码处理

    (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")。 这两种转码方式是很好用...

    google translate api 0.95

    使用非常简单 ---------------------------------------- HttpServletRequest request = ... msg = Translate.execute(URLDecoder.decode(q, "utf-8"), getLan(sourceLan), getLan(targetLan)); return SUCCESS;

    java中文乱码之解决URL中文乱码问题的方法

    在服务器端,使用`URLDecoder.decode(name, "UTF-8")` 进行解码。 2. **Java服务器端处理**: - 在Java中,当从URL获取参数时,`HttpServletRequest.getParameter()` 默认使用ISO-8859-1编码,这可能导致中文乱码...

    java中的URLEncoder和URLDecoder类.docx

    String decodedStr = URLDecoder.decode("Hello%20World", "UTF-8"); System.out.println(decodedStr); // 输出: Hello World } catch (UnsupportedEncodingException e) { e.printStackTrace(); } ``` - **...

    commons-codec-1.9.jar

    `UrlEncoder`和`UrlDecoder`接口提供了URL编码和解码的实现,确保URL的正确传输。 4. **语音编码**:Apache Commons Codec还支持电话号码的E.164格式,这是一种国际电话号码的标准格式。`PhoneticEncoder`类提供了...

    android客户端向服务器提交请求的中文乱码问题

    String province = URLDecoder.decode(request.getParameter("site.province"), "UTF-8"); String city = URLDecoder.decode(request.getParameter("site.city"), "UTF-8"); ``` 通过这种方式,客户端和服务器端...

    Java Http请求传json数据乱码问题的解决

    由于`request.getParameter`方法本身不直接支持指定字符编码,因此需要使用`URLDecoder.decode`方法对参数字符串进行解码,指定"utf-8"字符集,以保证数据能够正确解析。 另外,当使用Base64进行加密传输时,因为...

    java传值中的乱码

    String keyVal = URLDecoder.decode(ServletActionContext.getRequest().getParameter("key"), "utf-8"); ``` - `ServletActionContext.getRequest()`用于获取当前HttpServletRequest对象,从而可以从中获取请求...

Global site tag (gtag.js) - Google Analytics