Просто нужен кто-то, знакомый с HTTPClient, чтобы проверить кусок кода - PullRequest
1 голос
/ 06 июня 2010

вот два маленьких вспомогательных метода, которые я сделал для загрузки файлов. Мне приходилось смешивать и сочетать разные учебники в Интернете, чтобы получить то, что у меня здесь.

Есть ли что-нибудь, что я здесь сделал явно неправильно?

    public static InputStream simplePostRequest(URL url, List<NameValuePair> postData) throws ClientProtocolException, IOException {
    DefaultHttpClient httpclient = new DefaultHttpClient();  
    HttpPost postMethod=new HttpPost(url.toExternalForm());      
    postMethod.setEntity(new UrlEncodedFormEntity(postData, HTTP.UTF_8));
    HttpResponse response = httpclient.execute(postMethod);
    HttpEntity entity = response.getEntity();

    return entity.getContent();
}




public static InputStream simpleGetRequest(URL url, List<NameValuePair> queryString) throws ClientProtocolException, IOException {

    Uri.Builder uri = new Uri.Builder();
    uri.path(url.getPath());
    for(NameValuePair nvp: queryString) {
        uri.appendQueryParameter(nvp.getName(), nvp.getValue());
    }

    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpHost host = new HttpHost(url.getHost());
    HttpResponse response = httpClient.execute(host, new HttpGet(uri.build().toString()));
    HttpEntity entity = response.getEntity();

    return entity.getContent();
}

1 Ответ

4 голосов
/ 06 июня 2010

Я не ожидал бы огромного ответа на такой неопределенный вопрос. Почему бы не написать пару модульных тестов, чтобы попробовать свой код?

В любом случае, из-за моего опыта работы с HttpClient меня выделяет то, что если вы подвергаетесь большой нагрузке (большое количество одновременных потоков), ваш код кажется небезопасным - кажется, что нет верхней границы для числа одновременные соединения, которые могут быть созданы.

Если вы считаете, что это может иметь значение в вашем случае, вы можете попробовать что-то вроде этого:

class X {

  private static final HttpClient httpClient;

  static {
    SchemeRegistry defaultRegistery = new DefaultHttpClient().getConnectionManager()
                .getSchemeRegistry();
    ThreadSafeClientConnManager connMgr = new ThreadSafeClientConnManager(defaultRegistery);
    connMgr.setMaxTotalConnections(10);
    connMgr.setDefaultMaxPerRoute(10);
    httpClient = new DefaultHttpClient(connMgr);
    httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
  }

  public static InputStream simpleGetRequest(URL url, List<NameValuePair> queryString) throws ClientProtocolException, IOException {...}

  public static InputStream simpleGetRequest(URL url, List<NameValuePair> queryString) throws ClientProtocolException, IOException {...}

}

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

Я скопировал и изменил это из некоторого кода, который я написал ранее, но не считаю это обязательно правильным. Модульные тесты будут вашими друзьями здесь.

РЕДАКТИРОВАТЬ: Что касается вашего комментария о смешивании URL и класса библиотеки HttpClient NameValuePair (это вас беспокоит?), Почему бы не просто Map в сигнатурах метода?

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