HttpGet / Клиент и HTTPS - PullRequest
3 голосов
/ 05 мая 2011

Ранее я использовал пользовательский TrustManager, о котором говорилось здесь , чтобы сделать это

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

XMLReader xr = sp.getXMLReader();
MyXMLHandler mHandler = new MyXMLHandler();
xr.setContentHandler(mHandler);

xr.parse(new InputSource(buildUrlString()));

(где buildUrlString () возвращает строку, содержащую URL-адрес https: // для вызова), который работаетхорошо.Тем не менее, я хочу теперь иметь возможность отправлять тот же URL заголовок Accept-Encoding для сжатия gzip.Я могу сделать это следующим образом

HttpUriRequest request = new HttpGet(buildUrlString());
request.addHeader("Accept-Encoding", "gzip");
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);

InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if ((contentEncoding != null)
    && contentEncoding.getValue().equalsIgnoreCase("gzip")) 
{ 
  instream = new GZIPInputStream(instream);
} 
xr.parse(new InputSource(instream));

, но это возвращает ошибку «Ненадежный сертификат сервера», которую я хочу игнорировать.Как мне сделать это сделать HTTPS?В качестве альтернативы, есть ли лучший способ сделать это?(И нужно ли мне сначала что-то проверить, чтобы убедиться, что телефон действительно может принять gzip-страницы, о которых я говорю, что это возможно?)

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Если вы хотите использовать API клиента Apache HTTP, вы можете продолжать использовать свой собственный TrustManager, расширив DefaultHttpClient

import org.apache.http.conn.ssl.SSLSocketFactory;

public class MyHttpClient extends DefaultHttpClient {
  final Context context;

  public MyHttpClient(Context context) {
    this.context = context;
  }

  @Override 
  protected ClientConnectionManager createClientConnectionManager() {
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", newSslSocketFactory(), 443));
    return new SingleClientConnManager(getParams(), registry);
  }

  private SSLSocketFactory newSslSocketFactory() {
    try {
      TrustManager tm = new MyCustomTrustManager();
      SSLContext ctx = SSLContext.getInstance("TLS");
      ctx.init(null, new TrustManager[] {tm}, null);
      SSLSocketFactory sf = new SSLSocketFactory(ctx);
      return new SSLSocketFactory(ctx);
    } catch (Exception e) {
      throw new Error(e);
    }
  }
}
1 голос
/ 05 мая 2011

На самом деле это работает:

URL url = new URL(buildUrlString());
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestProperty("Accept-Encoding","gzip"); 

InputStream instream = conn.getInputStream();
String response = conn.getContentEncoding();
if ((response != null)
    && response.equalsIgnoreCase("gzip")) 
{ 
  instream = new GZIPInputStream(instream);
} 
xr.parse(new InputSource(instream));

Я все еще не уверен, что это лучшее решение, поэтому я оставлю вопрос на некоторое время на случай, если у кого-нибудь появятся лучшие идеи.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...