Java HttpsURLConnection字符串索引超出范围:-1

时间:2014-10-20 22:51:57

标签: java

我正在尝试对URL发出POST请求,但我收到的字符串索引超出范围-1,我标记了错误发生的位置。

urlParameters字符串看起来很好,所有参数都按照它们的设置进行设置。

protected StringBuffer post(String endpoint, Map<String, String> postData) throws Exception  {

    URL obj = new URL(url + endpoint);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    // fix url parameters
    StringBuilder stringBuilder = new StringBuilder();
    Iterator iterator = postData.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry entry = (Map.Entry) iterator.next();
        stringBuilder.append(entry.getKey() + "=" + URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
        if (iterator.hasNext()) {
            stringBuilder.append("&");
        }
    }
    String urlParameters = stringBuilder.toString();

    // add reuqest header
    con.setRequestMethod("POST");
    con.setInstanceFollowRedirects(true);
    con.setRequestProperty("Content-length", String.valueOf(urlParameters.length()));
    con.setRequestProperty("User-Agent", USER_AGENT);
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
    con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    con.setDoOutput(true);
    con.setDoInput(true);
    cookieManager.setCookies(con);

    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode(); // responseCode is 302? I don't know if that has something to do with it

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    // Store cookies
    cookieManager.storeCookies(con);

    while ((inputLine = in.readLine()) != null) { // Error is here
        response.append(inputLine);
    }
    in.close();

    return response;
}

堆栈追踪:

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 [Ljava.lang.StackTraceElement; @ 256415ae

编辑

问题似乎发生在while((inputLine = in.readLine())!= null){

编辑2

我查询了查尔斯的请求,这就是查尔斯代理所说的:

SSLHandshake:收到致命警报:certificate_unknown

1 个答案:

答案 0 :(得分:0)

如果响应代码为302,则无法读取响应正文,因此您所做的事情无论如何都不会有效。但是我不知道如何在使用setInstanceFollowRedirects(true)时获得302。我也不知道如何在证书错误后获得HTTPS 302。

我强烈怀疑您没有运行您认为自己正在运行的代码。

注意:您不需要设置Content-Length标头,您应该URLEncode参数名称和值。