POST-запрос по SSL с базовой авторизацией - нужен код

Ответить
djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

POST-запрос по SSL с базовой авторизацией - нужен код

Сообщение djdance » 05 дек 2012, 23:11

Привет всем собравшимся.

Сразу сложный вопрос.
Надо соединиться с сервером, передать POST, получить ответ. Адрес вида
https://blabla.ru:1234 - где стоит авторизация basic. Сертификат SSC там допустим самогенерированный, клиентского не нужно.
Погуглил, есть несколько велосипедов, ни один у меня не заработал, особенно смущает порт.

Приведите плиз полный пример, в том числе как сделать POST и забрать ответ.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: POST-запрос по SSL с базовой авторизацией - нужен код

Сообщение rezak90 » 06 дек 2012, 00:05

Да ладно нету примеров, их тысячи. Что за народ пошёл просит написать. Дело будет быстрее если вы напишете, пускай не рабочий код, пускай велосипед но так вы быстрее поймёте и мы совместным трудом укажем что где не правильно.
Любая авторизация ничем не отличается. На каждом ЯП она пишется одинаково. На андроиде рекомендовано использовать апачевские либы, так как они чудесны, стабильны, в общем они могут всё.
Самое главное собрать правильный запрос, так есть установить правильные хидеры. Если даже что то не получится попробуйте авторизоваться через обычный браузер и во врем авторизации просниферить свой трафик где будут видны отправляемые браузером хидеры которые вам следует повторить на андроиде.
Базовые классы: DefaultHttpClient (управляемый класс), HttpParams (устанавливаемые параметры, такие как таймаут, редирект и т.д.), HttpPost (класс для управления пост запросом), *Entity (это энтити, звёздочка значит там есть много энтити: http://developer.android.com/reference/ ... mmary.html при помощи которых можно отправлять от строки до файла и т.д.), HttpURLConnection (параметры соединения), SchemeRegistry (установит вам необходимый протокол и порт).
В общем вкусностей много и всё сделано до воли таки по человечески (это же всё таки apache).
R.id.team
Политика на форуме запрещена

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: POST-запрос по SSL с базовой авторизацией - нужен код

Сообщение djdance » 06 дек 2012, 00:25

Пост отредактирован, решение найдено

В моем случае для 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();
    }
}
Да, из org.apache.http.conn.ssl.SSLSocketFactory

клиент:

Код: Выделить всё

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 {
        }
    };

Ответить