Привет всем собравшимся.
Сразу сложный вопрос.
Надо соединиться с сервером, передать POST, получить ответ. Адрес вида
https://blabla.ru:1234 - где стоит авторизация basic. Сертификат SSC там допустим самогенерированный, клиентского не нужно.
Погуглил, есть несколько велосипедов, ни один у меня не заработал, особенно смущает порт.
Приведите плиз полный пример, в том числе как сделать POST и забрать ответ.
POST-запрос по SSL с базовой авторизацией - нужен код
Re: POST-запрос по SSL с базовой авторизацией - нужен код
Да ладно нету примеров, их тысячи. Что за народ пошёл просит написать. Дело будет быстрее если вы напишете, пускай не рабочий код, пускай велосипед но так вы быстрее поймёте и мы совместным трудом укажем что где не правильно.
Любая авторизация ничем не отличается. На каждом ЯП она пишется одинаково. На андроиде рекомендовано использовать апачевские либы, так как они чудесны, стабильны, в общем они могут всё.
Самое главное собрать правильный запрос, так есть установить правильные хидеры. Если даже что то не получится попробуйте авторизоваться через обычный браузер и во врем авторизации просниферить свой трафик где будут видны отправляемые браузером хидеры которые вам следует повторить на андроиде.
Базовые классы: DefaultHttpClient (управляемый класс), HttpParams (устанавливаемые параметры, такие как таймаут, редирект и т.д.), HttpPost (класс для управления пост запросом), *Entity (это энтити, звёздочка значит там есть много энтити: http://developer.android.com/reference/ ... mmary.html при помощи которых можно отправлять от строки до файла и т.д.), HttpURLConnection (параметры соединения), SchemeRegistry (установит вам необходимый протокол и порт).
В общем вкусностей много и всё сделано до воли таки по человечески (это же всё таки apache).
Любая авторизация ничем не отличается. На каждом ЯП она пишется одинаково. На андроиде рекомендовано использовать апачевские либы, так как они чудесны, стабильны, в общем они могут всё.
Самое главное собрать правильный запрос, так есть установить правильные хидеры. Если даже что то не получится попробуйте авторизоваться через обычный браузер и во врем авторизации просниферить свой трафик где будут видны отправляемые браузером хидеры которые вам следует повторить на андроиде.
Базовые классы: DefaultHttpClient (управляемый класс), HttpParams (устанавливаемые параметры, такие как таймаут, редирект и т.д.), HttpPost (класс для управления пост запросом), *Entity (это энтити, звёздочка значит там есть много энтити: http://developer.android.com/reference/ ... mmary.html при помощи которых можно отправлять от строки до файла и т.д.), HttpURLConnection (параметры соединения), SchemeRegistry (установит вам необходимый протокол и порт).
В общем вкусностей много и всё сделано до воли таки по человечески (это же всё таки apache).
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: POST-запрос по SSL с базовой авторизацией - нужен код
Пост отредактирован, решение найдено
В моем случае для HttpClient:
Да, из org.apache.http.conn.ssl.SSLSocketFactory
клиент:
а вот трастменеджер пришлось найти работающий в другом месте, вот такой заработал:
В моем случае для HttpClient:
Код: Выделить всё
public class Naive_SSLSocketFactory extends SSLSocketFactory
{
protected SSLContext Cur_SSL_Context = SSLContext.getInstance("TLS");
public Naive_SSLSocketFactory()
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
{
super(null, null, null, null, null, null);
Cur_SSL_Context.init(null, new TrustManager[]{new X509_Trust_Manager()}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException
{
return Cur_SSL_Context.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException
{
return Cur_SSL_Context.getSocketFactory().createSocket();
}
}клиент:
Код: Выделить всё
HttpClient client = null;
try
{
SchemeRegistry Current_Scheme = new SchemeRegistry();
Current_Scheme.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
Current_Scheme.register(new Scheme("https", new Naive_SSLSocketFactory(), 443));
HttpParams Current_Params = new BasicHttpParams();
ThreadSafeClientConnManager Current_Manager = new ThreadSafeClientConnManager(Current_Params,Current_Scheme);
client = new DefaultHttpClient(Current_Manager, Current_Params);
}
catch(Exception e)
{
e.printStackTrace();
}Код: Выделить всё
TrustManager easyTrustManager = new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
};