我正在尝试对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
答案 0 :(得分:0)
如果响应代码为302,则无法读取响应正文,因此您所做的事情无论如何都不会有效。但是我不知道如何在使用setInstanceFollowRedirects(true)
时获得302。我也不知道如何在证书错误后获得HTTPS 302。
我强烈怀疑您没有运行您认为自己正在运行的代码。
注意:您不需要设置Content-Length标头,您应该URLEncode参数名称和值。