@wenshao
我有一个使用springmvc请求其他api接口的网站。
我使用HttpHelper.doPost方法进行请求。

 public static String doPost(String url, String json,String... args) throws Exception {
    URL localURL = new URL(url);

    URLConnection connection = localURL.openConnection();
    HttpURLConnection httpURLConnection = (HttpURLConnection) connection;

    String encoding = getEncoding(args);
    int connectTimeout = getConnectTimeout(args);
    int readTimeout = getReadTimeout(args);

    httpURLConnection.setDoOutput(true);
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Accept-Charset", encoding);
    httpURLConnection.setConnectTimeout(connectTimeout);
    httpURLConnection.setReadTimeout(readTimeout);
    httpURLConnection.setRequestProperty("Content-Type", "application/json");
    httpURLConnection.setRequestProperty("Content-Length", String.valueOf(json.length()));


    OutputStream outputStream = null;
    OutputStreamWriter outputStreamWriter = null;
    InputStream inputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader reader = null;
    StringBuffer resultBuffer = new StringBuffer();
    String tempLine;

    try {
        outputStream = httpURLConnection.getOutputStream();
        outputStreamWriter = new OutputStreamWriter(outputStream);

        outputStreamWriter.write(json);
        outputStreamWriter.flush();

        if (httpURLConnection.getResponseCode() >= 400) {
            inputStream = httpURLConnection.getErrorStream();
        } else {
            inputStream = httpURLConnection.getInputStream();
        }
        inputStreamReader = new InputStreamReader(inputStream, encoding);
        reader = new BufferedReader(inputStreamReader);

        while ((tempLine = reader.readLine()) != null) {
            resultBuffer.append(tempLine);
        }
    } finally {
        close(outputStreamWriter, outputStream, reader, inputStreamReader, inputStream);
    }
    return String.valueOf(resultBuffer);
}


如果我使用单元测试使用上面的代码请求api,它的工作效果很好。但是当我使用springmvc操作请求它时,它给我服务器错误500:index超出了api接口的范围-1。以下代码始终返回当我使用springmvc请求时为-1。

 public static int decodeUTF8(byte[] sa, int sp, int len, char[] da) {
    final int sl = sp + len;
    int dp = 0;
    int dlASCII = Math.min(len, da.length);

    // ASCII only optimized loop
    while (dp < dlASCII && sa[sp] >= 0)
        da[dp++] = (char) sa[sp++];

    while (sp < sl) {
        int b1 = sa[sp++];
        if (b1 >= 0) {
            // 1 byte, 7 bits: 0xxxxxxx
            da[dp++] = (char) b1;
        } else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) {
            // 2 bytes, 11 bits: 110xxxxx 10xxxxxx
            if (sp < sl) {
                int b2 = sa[sp++];
                if ((b2 & 0xc0) != 0x80) { // isNotContinuation(b2)
                    return -1;
                } else {
                    da[dp++] = (char) (((b1 << 6) ^ b2)^
                                   (((byte) 0xC0 << 6) ^
                                    ((byte) 0x80 << 0)));
                }
                continue;
            }
            return -1;
        } else if ((b1 >> 4) == -2) {
            // 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
            if (sp + 1 < sl) {
                int b2 = sa[sp++];
                int b3 = sa[sp++];
                if ((b1 == (byte) 0xe0 && (b2 & 0xe0) == 0x80) //
                    || (b2 & 0xc0) != 0x80 //
                    || (b3 & 0xc0) != 0x80) { // isMalformed3(b1, b2, b3)
                    return -1;
                } else {
                    char c = (char)((b1 << 12) ^
                                      (b2 <<  6) ^
                                      (b3 ^
                                      (((byte) 0xE0 << 12) ^
                                      ((byte) 0x80 <<  6) ^
                                      ((byte) 0x80 <<  0))));
                    boolean isSurrogate =  c >= Character.MIN_SURROGATE && c < (Character.MAX_SURROGATE + 1);
                    if (isSurrogate) {
                        return -1;
                    } else {
                        da[dp++] = c;
                    }
                }
                continue;
            }
            return -1;
        } else if ((b1 >> 3) == -2) {
            // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
            if (sp + 2 < sl) {
                int b2 = sa[sp++];
                int b3 = sa[sp++];
                int b4 = sa[sp++];
                int uc = ((b1 << 18) ^
                          (b2 << 12) ^
                          (b3 <<  6) ^
                          (b4 ^
                           (((byte) 0xF0 << 18) ^
                           ((byte) 0x80 << 12) ^
                           ((byte) 0x80 <<  6) ^
                           ((byte) 0x80 <<  0))));
                if (((b2 & 0xc0) != 0x80 || (b3 & 0xc0) != 0x80 || (b4 & 0xc0) != 0x80) // isMalformed4
                    ||
                    // shortest form check
                    !Character.isSupplementaryCodePoint(uc)) {
                    return -1;
                } else {
                    da[dp++] =  (char) ((uc >>> 10) + (Character.MIN_HIGH_SURROGATE - (Character.MIN_SUPPLEMENTARY_CODE_POINT >>> 10))); // Character.highSurrogate(uc);
                    da[dp++] = (char) ((uc & 0x3ff) + Character.MIN_LOW_SURROGATE); // Character.lowSurrogate(uc);
                }
                continue;
            }
            return -1;
        } else {
            return -1;
        }
    }
    return dp;
}


正常将返回我的请求json的实际长度,但spring不会。
java - Java:阿里巴巴Fastjson解码UTF8返回:springmvc中的索引超出范围-1?-LMLPHP

java - Java:阿里巴巴Fastjson解码UTF8返回:springmvc中的索引超出范围-1?-LMLPHP

java - Java:阿里巴巴Fastjson解码UTF8返回:springmvc中的索引超出范围-1?-LMLPHP

编辑:
我找到了发生错误的原因,因为我在请求json中传递了中文,我该如何解决?

最佳答案

我已经解决了。
正确的代码:

new String(request.getRealName().getBytes(),"utf-8")


错误的代码:

new String(request.getRealName().getBytes("utf-8"),"utf-8")


因为我系统的默认编码是gbk而不是utf-8。

关于java - Java:阿里巴巴Fastjson解码UTF8返回:springmvc中的索引超出范围-1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45657936/

10-09 09:23