2015-07-21 35 views
1

由于HTTP客户端相关的类,我有大量的弃用。如何修复使用原生Java库多个Http *类和方法弃用

这里我的代码:

this.httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 
    HttpResponse response = this.httpclient.execute(httpget); 
    HttpEntity entity = response.getEntity(); 
    int statusCode = response.getStatusLine().getStatusCode(); 
    if (statusCode == HttpStatus.SC_OK) { 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(entity.getContent(), 
         EntityUtils.getContentCharSet(entity)) 
     ); 
     String line = null; 
     Matcher matcher = null; 
     while ((line = reader.readLine()) != null) { 
      matcher = matcher == null ? this.resultPattern 
        .matcher(line) : matcher.reset(line); 
      if (matcher.matches()) { 
       httpget.abort(); 
       return Double.parseDouble(matcher.group(1)); 
      } 
     } 
     httpget.abort(); 
     throw new MyException("Could not find [" 
       + resultPattern.toString() + "] in response to [" + url 
       + "]"); 
    } else { 
     if (entity != null) { 
      entity.consumeContent(); 
     } 
     throw new MyException("Got [" + statusCode 
       + "] in response to [" + url + "]"); 
    } 

DefaultHttpClient弃用 HttpResponse弃用 HttpEntity弃用

我怎么能修复使用本地库?我搜索了一些人HttpClient使用HttpClientBuilder但需要一个额外的库,此外我不知道如何解决其他折旧问题。

有没有一些程序员可以帮助我? 这种大规模弃用的原因是什么?

似乎现在我们应该使用HttpURLConnection,但我还没有理解如何将我的代码迁移到这些库。

回答

-1

如果您正在开发Android版本,您应该已经转向使用Volley,这会更好。我记得这些方法已被废弃,并且没有其他本地库。

+0

这是一个/意见为基础的B /不正确 – njzk2

0

我该如何修复使用本机库?

我不知道在这种情况下你认为“本地库”是什么。 Android的内置版本的HttpClient已被Android 5.1弃用,并且在M Developer Preview中完全删除。

如果您需要坚持使用Apache HttpClient API,请切换至Apache's edition of their library

可以切换到任意数量的其他HTTP的API,如内置HttpUrlConnectionOkHttp

这是什么大规模弃用的原因是什么?

Google has indicated for a few years that you should not use HttpClient;他们现在只是在执行这个。

+0

感谢您的回答,你能给我根据我的代码的样本?看起来与我必须用来执行相同操作的语法完全不同 – AndreaF

+0

OkHttp与HttpClient足够接近,您可以在代码中做很少更改的情况下执行相同(基本)的操作,IIRC – njzk2

0

我已经构建了一个使用标准Java库的HttpUtil类。你可以修改它。我只是将所有内容都设置为地图,然后您可以轻松发送帖子或获取。

HttpURLConnection urlConnection; 
String CHAR_ENCODING = "UTF-8"; 
String CONTENT_TYPE_X_WWW_FORM = "application/x-www-form-urlencoded;charset=UTF-8"; 

public String sendHttpPostRequestWithParams(String url, Map<String, Object> httpPostParams) { 
    try { 
     byte[] postDataBytes = setParameters(httpPostParams).toString().getBytes(CHAR_ENCODING); 

     URL post = new URL(url); 
     urlConnection = (HttpURLConnection) post.openConnection(); 
     urlConnection.setDoOutput(true); 
     urlConnection.setRequestProperty("Accept-Charset", CHAR_ENCODING); 
     urlConnection.setRequestProperty("Content-Type", CONTENT_TYPE_X_WWW_FORM); 
     urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
     urlConnection.getOutputStream().write(postDataBytes); 

     return convertStreamToString(urlConnection.getInputStream()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return Constants.GSON.toJson(new BaseResponse(ResponseCodes.SERVICE_NOT_FOUND.getCode(), 
       ResponseCodes.SERVICE_NOT_FOUND.getMessage())); 
    } 
} 

public String sendHttpGetRequestWithParams(String stringUrl, Map<String, Object> params) { 
    try { 
     URL url = new URL(stringUrl + "?" + setParameters(params)); 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     return convertStreamToString(urlConnection.getInputStream()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return Constants.GSON.toJson(new BaseResponse(ResponseCodes.SERVICE_NOT_FOUND.getCode(), 
       ResponseCodes.SERVICE_NOT_FOUND.getMessage())); 
    } 
} 

public String setParameters(Map<String, Object> params) { 
    try { 
     StringBuilder parameters = new StringBuilder(); 
     for (Map.Entry<String, Object> param : params.entrySet()) { 
      if (parameters.length() != 0) { 
       parameters.append('&'); 
      } 
      parameters.append(URLEncoder.encode(param.getKey(), CHAR_ENCODING)); 
      parameters.append('='); 
      parameters.append(URLEncoder.encode(String.valueOf(param.getValue()), CHAR_ENCODING)); 
     } 
     return parameters.toString(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
} 

public String convertStreamToString(InputStream inputStream) { 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     String temp, response = ""; 
     while ((temp = reader.readLine()) != null) { 
      response += temp; 
     } 
     return response; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
0

由于谷歌documentation说你仍然可以使用HTTP Apache API接口。声明以下依赖于你的gradle.build文件:

android { 
    useLibrary 'org.apache.http.legacy' 
} 
相关问题