HttpClient和HttpURLConnection的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpClient和HttpURLConnection的区别相关的知识,希望对你有一定的参考价值。

首先:在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。
其次:HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,

HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。
HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

使用HttpClient发送请求、接收响应很简单,只要如下几步即可:
1.创建HttpClient对象。
2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
参考技术A HttpClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等,
HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便
HttpClient实际上是对Java提供方法的一些封装,
在HttpURLConnection中的输入输出流操作,
在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,
这样,就减少了操作的繁琐性。
HttpClient:
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。
但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。
HttpURLConnection:
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。本回答被提问者采纳
参考技术B 首先:在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。
其次:HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,

HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。
HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

使用HttpClient发送请求、接收响应很简单,只要如下几步即可:
1.创建HttpClient对象。
2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

如何使用 HttpUrlConnect 使用 java 查询 Github graphql API

【中文标题】如何使用 HttpUrlConnect 使用 java 查询 Github graphql API【英文标题】:How to query Github graphql API with java using HttpUrlConnect 【发布时间】:2018-04-22 10:09:53 【问题描述】:

我不知道我的代码出了什么问题,当我尝试向 GitHub 发出请求时,我不断收到错误 401。我的应用之前使用 REST API 并将其转换为 Graphql,但我发现它很困难

private static String makeHttpRequest(URL url) throws IOException 
    String jsonResponse = "";

   // If the URL is null, then return early.
    if (url == null) 
        return jsonResponse;
    

    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;
    try 
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setReadTimeout(10000 /* milliseconds */);
        urlConnection.setConnectTimeout(15000 /* milliseconds */);
        urlConnection.setRequestMethod("POST");
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setRequestProperty("Authorization","Bearer token");
        urlConnection.setRequestProperty("Content-Type", "application/json");


        DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
        wr.writeBytes("\"query\":\"querysearch(type:USER query:\"location:lagos language:java\")userCount");
        wr.flush();
        wr.close();

        int rc = urlConnection.getResponseCode();
        inputStream = urlConnection.getInputStream();
        jsonResponse = readFromStream(inputStream);

     catch (IOException e) 
        Log.e(LOG_TAG, "Problem retrieving the earthquake JSON results.", e);
     finally 
        if (urlConnection != null) 
            urlConnection.disconnect();
        
        if (inputStream != null) 
            inputStream.close();
        
    
    return jsonResponse;

【问题讨论】:

【参考方案1】:

发现错误

我的令牌有问题,查询格式应该是错误的

"\"query\": \"query  search ( type : USER, query : \\\"location:lagos\\\" )  userCount \"" 

感谢您的建议

【讨论】:

【参考方案2】:

授权标头令牌可能无效。 HTTP 401 = 未授权。

【讨论】:

“不记名令牌”。令牌是占位符,对吧?您需要从服务提供商处获取。有点像密码。 是的,我有,但仍然面临同样的问题。我确实用我的访问令牌替换了令牌【参考方案3】:

我建议尝试使用 Curl 发出相同的请求,当您看到成功时 - 将相同的参数/标头应用于 HttpUrlConnection。

【讨论】:

以上是关于HttpClient和HttpURLConnection的区别的主要内容,如果未能解决你的问题,请参考以下文章

HttpUrlConnect post提交

Android回顾系列——之HttpUrlConnect的使用

如何使用 HttpUrlConnect 使用 java 查询 Github graphql API

Android探索之HttpURLConnection网络请求

论httpclient上传带参数commons-httpclient和apache httpclient区别

android和httpClient