#java #https
#java #https
Вопрос:
Я пишу мод для игры на Java, чтобы проверить, проголосовал ли игрок, используя серверные методы, чтобы получить Steam ID. Я не могу получить хороший ответ от того, что я вижу. Каждый ответ — это исключение IOException, которое я распечатал «Недопустимый код ответа».
Я пытался реализовать то, что видел в аналогичных модах для https-соединений, но у меня ничего не получается.
try {
HttpsURLConnection connection = (HttpsURLConnection) new URL( "https://somewebsite.com/"
).openConnection();
connection.setSSLSocketFactory(createTrustAllSocketFactory());
int responseCode = connection.getResponseCode();
if (responseCode != 200) throw new IOException("Invalid response code.");
InputStream in = connection.getInputStream();
ByteArrayOutputStream stringBuffer = new ByteArrayOutputStream();
byte[] buffer = new byte[256];
int len = 0;
while (len != -1) {
stringBuffer.write(buffer, 0, len);
len = in.read(buffer);
}
String result = new String(stringBuffer.toByteArray(), StandardCharsets.UTF_8);
if (result.equals("1")) {
try {
performer.addMoney(MonetaryConstants.COIN_COPPER * 5);
performer.getCommunicator().sendNormalServerMessage("Thanks for voting! Your rewards have been added to your bank.");
} catch (IOException ex) {
performer.getCommunicator().sendAlertServerMessage("Failed to add reward. Please submit a support ticket.");
ex.printStackTrace();
}
}
private static SSLSocketFactory createTrustAllSocketFactory() throws IOException {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = {
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
/* empty */
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
/* empty */
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
ctx.init(null, trustManagers, null);
return ctx.getSocketFactory();
} catch (GeneralSecurityException ex) {
throw new IOException(ex);
}
}
Ожидается, что когда команда будет выдана в игре, сервер вызовет внешний сайт с идентификатором steam игрока и сгенерирует 0 или 1 в зависимости от того, проголосовали ли они.
Фактический получает неверный код ответа.
Комментарии:
1. Я надеюсь, что введенный вами ключ не должен быть секретным. Если это так, вам нужно изменить его сейчас . Кроме того, вы создаете исключение IOException для любого статуса, отличного от 200, но вы не сообщаете, каков статус. Я бы предложил записать код состояния (и, возможно, тело ответа), чтобы вы могли определить, в чем проблема с вашим запросом.
2. @ChrisThompson Да, я сбросил ключ API перед публикацией. После принятия вашей рекомендации похоже, что код возвращается как 403, но в браузере он работает нормально.
3. На самом деле это было все, что мне было нужно. Он возвращал 403, потому что ему нужен пользовательский агент. Спасибо, чувак.