2017-08-13 22 views
0

@wenshao 我有一個網站使用springmvc來請求其他api界面。 我使用HttpHelper.doPost方法來請求。Java:Alibaba Fastjson decodeUTF8 return:索引超出範圍-1 from springmvc?

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 above.But當我用SpringMVC使用行動要求它,它給我的服務器錯誤500,它工作正常:索引超出範圍-1從API當我使用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的實際長度,但春天不會。 broken request

correct request using postman to request

the correct length

編輯: 我找到了原因,爲什麼錯誤occurred.Because我通過了中國在請求我json.how能解決嗎?

回答

0

我已經解決了。 正確的代碼:

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

錯誤代碼:

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

,因爲我的系統的默認編碼爲GBK不是UTF-8。