Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Загвоздка с XML-запросом / 9 сообщений из 9, страница 1 из 1
21.12.2012, 20:39:31
    #38088762
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Проблема в следующем...
По протоколу HTTPS соединяюсь с сервером, отсылаю XML-запрос, получаю XML-ответ, пользуюсь данными.
Программировал бОльшую часть на C++ Builder. Там проблем не было. Сейчас нужно переписать задачу на Java. Вот отрывок кода:
public Object commandButton_action1()
{
HttpsURLConnection con;
URL url;
url = new URL(null, " https://address?cmd=zapros", new sun.net.www.protocol.https.Handler());
con = (HttpsURLConnection)url.openConnection();
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Есть верификация!");
return true;
}
};
con.setDefaultHostnameVerifier(hv);
SSLSocketFactory ssl = null;
ssl = getFactory(new File("c:\\OpenSSL\\mySSL\\mykey.p12"), "qwerty");
con.setDefaultSSLSocketFactory(ssl);
con.setDoOutput(true);
con.setDoInput(true);
String test="<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><parameter1>19</parameter1><parameter2>xcd</parameter2></request>";
byte[] bytes=test.getBytes();
con.setRequestMethod("POST");
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/xml");
OutputStream writer = con.getOutputStream();
writer.write(bytes);
writer.flush();
writer.close();
int rc = con.getResponseCode();
if (rc == HttpsURLConnection.HTTP_OK) {
System.out.println("Есть контакт!");
} else {
System.out.println(rc);
}
System.out.println(con.getResponseMessage());
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
setResp(resp+line+"\r");
}
reader.close();
}

private static SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword) {
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("pkcs12");
InputStream keyInput = new FileInputStream(pKeyFile);
keyStore.load(keyInput, pKeyPassword.toCharArray());
keyInput.close();
keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());
SSLContext context = SSLContext.getInstance("SSL");
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
} };
context.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new SecureRandom());
return context.getSocketFactory();
}


Вооооооот!
В консоли выдаётся дважды: "Есть верификация!" Выдаётся сообщение: "Есть контакт!"
Но дальше, когда я прошу распечатать BufferedReader reader, выдаётся XML-ответ:
<response status="error"><error code="ERRCMD">unsupported request method GET</error></response>
Хотя в коде явно сказано con.setRequestMethod("POST")
Помониторили мы с разработчиком этих самых XML-процедур. Он говорит, что от меня реально исходят GET-запросы - отсюда и ошибка. В общем бред какой-то! Причём даже если я не высылаю никакой запрос, а потом запрашиваю ответ, всё равно выдаётся это сообщение. Такое ощущение, что запрос вообще не отправляется. Где ошибка?
...
Рейтинг: 0 / 0
21.12.2012, 21:38:46
    #38088800
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Chicho,

Заюзай HttpClient да не мучайся
...
Рейтинг: 0 / 0
22.12.2012, 02:01:14
    #38088933
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Этот Java код не компилируется и поэтому не может работать даже неправильно.
А это что:

new sun.net.www.protocol.https.Handler()

Это называется жабабыдлокод. Название пакета у этого класса говорит о том, что он не предназначен для использования вами. Зачем использовали?
Вы где-то передрали, но неизвестно как оно работает. Вместо этого лучше бы изучить, как сделать правильно.
Если вы заведёте этот проект в Eclipse, а не в Notepad-е, то будут показаны и другие ошибки, которые хотя и не препятствуют трансляции, но следовало бы устранить. А то пока в программе нет порядка, труднее понять, почему она работает не так, как надо.
...
Рейтинг: 0 / 0
24.12.2012, 15:11:42
    #38090797
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
забыл ник, спасибо! Но к сожалению не получится. HttpClient - это апачевский класс, а я работаю в WebLigic Server.
...
Рейтинг: 0 / 0
24.12.2012, 15:14:44
    #38090799
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Chichoзабыл ник, спасибо! Но к сожалению не получится. HttpClient - это апачевский класс, а я работаю в WebLigic Server.
Одно другому не мешает.
...
Рейтинг: 0 / 0
24.12.2012, 16:00:23
    #38090863
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Blazkowicz, я понял. Просто надо было к проекту дополнительный .jar подключить.
...
Рейтинг: 0 / 0
24.12.2012, 19:02:17
    #38091093
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Блин! Как к HttpClient 3.1 присобачить SSL? Есть классы, но только для 4.x.
...
Рейтинг: 0 / 0
24.12.2012, 21:04:50
    #38091188
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Вот как неприятно ругается браузер:

javax.faces.el.EvaluationException: java.lang.ClassCastException: com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl cannot be cast to org.apache.http.conn.scheme.SchemeSocketFactory

при попытке выполнить: Scheme sc=new Scheme("https", 443, ssl);

Такое ощущение, что разработчики HttpClient приложили немалые усилия, чтобы быть несовместимой с SSLSocketFactory. А альтернатива, блин, где? В случае с HttpsURLConnection таких приколов не было.
...
Рейтинг: 0 / 0
25.12.2012, 12:55:00
    #38091779
Chicho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загвоздка с XML-запросом
Эврика!
Всё оказалось просто!
Вместо
авторBufferedReader reader = new BufferedReader(new InputStreamReader (url.openStream() ));
надо писать
авторBufferedReader reader = new BufferedReader(new InputStreamReader( con.getInputStream() ));
Первый вариант прокатывает только для метода GET.
Ура! Не повторяйте моих ошибок. Теперь бы на будущее с HttpClient'ом разобраться. Не хочет он SSLSocketFactory воспринимать. Если у кого-то есть опыт https-запросов, подскажите, как прописывать для него ключи и сертификаты.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Загвоздка с XML-запросом / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]