HTTPクライアントの詳細なHTTPリクエストのJAVA実装

目次

1.現在、JAVAがHTTPリクエストを実装するために最も使用する方法は2つあります。

この記事では、HTTPClientの使用法を紹介します。

2.依存

3、HttpClientのURIBuilder 

コンストラクタ

URIBuilderクラスのメソッド:

第4に、HttpClientを使用する基本的な手順は次のとおりです。

5、HttpClientの基本的なgetの使用法

6、HttpClientのjson後の使用法

セブン、HttpClientのポストフォームの使用法

8. HttpClientに関するよく書かれたブログ:


 

1.現在、JAVAがHTTPリクエストを実装するために最も使用する方法は2つあります。

  1. これは、HTTPClientなどのサードパーティのオープンソースフレームワークを介して実装されます。HTTPClientのHTTPのカプセル化は非常に優れており、基本的にほとんどのニーズを満たすことができます。最新のHttpClient4.5は、org.apache.http.impl.clientの下でリモートURLを操作するためのツールキットです。HttpClient3.1はorg.apacheです。ツールキットcommons.httpclientでリモートURLを操作するためのコードは更新されなくなりましたが、作業でhttpClient3.1を使用するためのコードはまだたくさんあります。
  2. もう1つは、HttpURLConnectionを介して実現されます。HttpURLConnectionはJAVAの標準クラスであり、JAVAの比較的ネイティブな実装です。これは使用しないでください。既存のツールを使用してみませんか。

 

この記事では、HTTPClientの使用法を紹介します。

2.依存

使用httpclient之前、先引入インマベン依赖:
<dependency>
    < groupId > org.apache.httpcomponents </
    groupId > <artifactId> httpclient </ artifactId>
    <version> 4.5.9 </ version>
</ dependency>

 

3、HttpClientのURIBuilder 

コンストラクタ

  1. URIBuilder()
  2. URIBuilder(final String string)は内部でURIオブジェクトを作成します:digestURI(new URI(string))
  3. URIBuilder(最終URI)

空でない2つの構造は、実際には内部でdigestURI(uri)を呼び出して、URIオブジェクトを解析し、クラスの属性に割り当てます。

 

URIBuilderクラスのメソッド:

①関連するメソッドを取得する

    String url = "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=";
    URIBuilder uriBuilder = new URIBuilder(url);
    System.out.println(uriBuilder.getScheme());
    System.out.println(uriBuilder.getUserInfo());
    System.out.println(uriBuilder.getHost());
    System.out.println(uriBuilder.getPort());
    System.out.println(uriBuilder.getPath());
    System.out.println(uriBuilder.getQueryParams());
    System.out.println(uriBuilder.getFragment());
    System.out.println(uriBuilder.getCharset());

    输出如下所示:
    scheme:http
    userinfo:null
    host:www.google.com
    port:-1  端口默认是80,当显示指定端口时,此处便能取到值
    path:/search
    queryParams:[hl=en, q=httpclient, btnG=Google Search, aq=f, oq=]
    fragment:null
    charset:null
    
    某些属性含义未知手动设置一次
    String url = "http://info.sporttery.cn/football/info/fb_match_hhad.php?m=102909";
    URIBuilder uriBuilder = new URIBuilder(url);
    uriBuilder.setFragment("111");
    uriBuilder.setUserInfo("222", "333");
    uriBuilder.setCharset(new GBK());
    System.out.println(uriBuilder.build());
    System.out.println(uriBuilder.getScheme());
    System.out.println(uriBuilder.getUserInfo());
    System.out.println(uriBuilder.getHost());
    System.out.println(uriBuilder.getPath());
    System.out.println(uriBuilder.getQueryParams());
    System.out.println(uriBuilder.getFragment());
    System.out.println(uriBuilder.getCharset());
    输出如下:
    http://222:[email protected]/football/info/fb_match_hhad.php?m=102909#111
    scheme:http
    userInfo:222:333   没见过这东西-。-
    host:info.sporttery.cn
    path:/football/info/fb_match_hhad.php
    queryParams:[m=102909]
    fragment:111   路由
    charset:GBK

 

②URIクエリパラメータ方式を追加

一般的な方法

  • setParameters(final List nvps)
  • setParameters(final NameValuePair…nvps)
  • addParameters(final List nvps)

上記の方法2つのセットは実際には同じだと思います。セットは元のパラメーターを同じ名前で上書きしますが、追加はしません

NameValuePairはこちら:

パラメータキーと値のペアを設定するために使用される実装クラスは1つだけです。BasicNameValuePair(最終的な文字列名、最終的な文字列値)

String url = "http://ads-mediation.internal.zkq.sg/media/app?m=102909";
    
URIBuilder uriBuilder = new URIBuilder(url);
ArrayList<NameValuePair> objects = new ArrayList<>();
NameValuePair m = new BasicNameValuePair("m", "1");
objects.add(m);
ArrayList<NameValuePair> objects1 = new ArrayList<>();
NameValuePair m1 = new BasicNameValuePair("m", "8");
objects1.add(m1);

uriBuilder.setParameters(objects);
uriBuilder.addParameters(objects1);
System.out.println(uriBuilder.build());
输出:http://ads-mediation.internal.zkq.sg/media/app?m=1&m=8

得出结论:set会覆盖原来的同名参数而add不会

 

  • addParameter(final String param、final String value)
  • setParameter(final String param、final String value)

パラメータと値は、これら2つのメソッド内でBasicNameValuePairにアセンブルされます。 

String url = "hhttp://ads-mediation.internal.zkq.sg/media/app?m=102909";
URIBuilder uriBuilder = new URIBuilder(url);
uriBuilder.setParameter("m", "2");
uriBuilder.addParameter("m" ,"5");
System.out.println(uriBuilder.build());
输出:http://ads-mediation.internal.zkq.sg/media/app?m=2&m=5
    
得出结论:set会覆盖原来的同名参数而add不会

 

③URIクエリパラメータをクリアします。

  • clearParameters()すべてのパラメーターをクリアします(つまり、?の後のキーと値のペア)
String url = "http://ads-mediation.internal.zkq.sg/media/app?m=102909";
URIBuilder uriBuilder = new URIBuilder(url);
uriBuilder.clearParameters();
System.out.println(uriBuilder.build());
输出:http://ads-mediation.internal.zkq.sg/media/app

 

第4に、HttpClientを使用する基本的な手順は次のとおりです。

HttpClientを使用して要求を送信し、応答を受信するのは非常に簡単です。通常、次の手順が必要です。

1.HttpClientオブジェクトを作成します。

2.リクエストメソッドのインスタンスを作成し、リクエストURLを指定します。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オブジェクトを取得します。プログラムは、このオブジェクトを介してサーバーの応答コンテンツを取得できます。

6.接続を解放します。実行方法が成功したかどうかに関係なく、接続を解放する必要があります

 

5、HttpClientの基本的なgetの使用法

public class HttpClientDemo {
   public void getRequest(String url) throws URISyntaxException, IOException {
     //创建httpClient实例
     CloseableHttpClient client = HttpClients.createDefault();
     //创建一个uri对象
     URIBuilder uriBuilder = new URIBuilder(url);
     //塞入form参数
     uriBuilder.addParameter("account", "123");
     uriBuilder.addParameter("password", "123");
     //创建httpGet远程连接实例,这里传入目标的网络地址
     HttpGet httpGet = new HttpGet(uriBuilder.build());
     // 设置请求头信息,鉴权(没有可忽略)
     httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
     // 设置配置请求参数(没有可忽略)
     RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
           .setConnectionRequestTimeout(35000)// 请求超时时间
           .setSocketTimeout(60000)// 数据读取超时时间
           .build();
     // 为httpGet实例设置配置
     httpGet.setConfig(requestConfig);
     //执行请求
     CloseableHttpResponse response = client.execute(httpGet);
     //获取Response状态码
      int statusCode = response.getStatusLine().getStatusCode();
      System.out.println(statusCode);
     //获取响应实体, 响应内容
      HttpEntity entity = response.getEntity();
     //通过EntityUtils中的toString方法将结果转换为字符串
      String str = EntityUtils.toString(entity);
      System.out.println(str);
      response.close();
      client.close();
   }
}
(如果用try catch 记得关闭资源)

 

6、HttpClientのjson後の使用法

 public String postRequest(String url, Map<String, Object> paramMap) {
     HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
     // 创建httpPost远程连接实例
     HttpPost post = new HttpPost(url);
     String result = "";
     try (CloseableHttpClient closeableHttpClient = httpClientBuilder.build()) {
        // HttpEntity entity = new StringEntity(jsonDataStr);
        // 修复 POST json 导致中文乱码
        HttpEntity entity = new StringEntity(paramMap.toString(), "UTF-8");
        post.setEntity(entity);
        post.setHeader("Content-type", "application/json");
        HttpResponse resp = closeableHttpClient.execute(post);
        try {
           InputStream respIs = resp.getEntity().getContent();
           byte[] respBytes = IOUtils.toByteArray(respIs);
           result = new String(respBytes, Charset.forName("UTF-8"));
        } catch (Exception e) {
           e.printStackTrace();
        }
        return result;
     } catch (IOException e) {
         e.printStackTrace();
     }
     return result;
}

 

セブン、HttpClientのポストフォームの使用法

フォームの鍵は、フォームの要素をこのコレクションに配置するNameValuePairを生成することです。 

次に、HttpPostのsetEntity(new UrlEncodedFormEntity(nameValuePair、HTTP.UTF_8))メソッドを使用して、生成されたフォーム要素コレクションを挿入します。

一般に、NameValuePairコレクションを介して送信されるパラメーターを格納し、このパラメーターコレクションをUrlEncodedFormEntityに渡してから、HttpPostのsetEntity()メソッドを呼び出して、構築されたUrlEncodedFormEntityを渡します。コードは次のとおりです。

List <NameValuePair> params = newArrayList <NameValuePair>();

Params.add(new BasicNameValuePair( "username"、 "admin"));

Params.add(new BasicNameValuePair(“ password”、” 123456”));

UrlEncodedFormEntity entity = newUrlEncodedFormEntity(params、” utf-8”);

httpPost.setEntity(entity);

サンプルコードは次のとおりです。

public static String postformRequest(String url, Map<String, Object> paramMap) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse httpResponse = null;
        String result = "";
        // 创建httpClient实例
        httpClient = HttpClients.createDefault();
        // 创建httpPost远程连接实例
        HttpPost httpPost = new HttpPost(url);
        // 配置请求参数实例(不需要可忽略)
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
                .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
                .setSocketTimeout(60000)// 设置读取数据连接超时时间
                .build();
        // 为httpPost实例设置配置(不需要可忽略)
        httpPost.setConfig(requestConfig);
        // 设置请求头
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
        // 封装表单参数
        if (null != paramMap && paramMap.size() > 0) {
            // 以下代码使用实现类BasicNameValuePair生成NameValuePair
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            // 通过map集成entrySet方法获取entity
            Set<Entry<String, Object>> entrySet = paramMap.entrySet();
            // 循环遍历,获取迭代器
            Iterator<Entry<String, Object>> iterator = entrySet.iterator();
            while (iterator.hasNext()) {
                Entry<String, Object> mapEntry = iterator.next();
                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
            }

            // 为httpPost设置封装好的请求参数
            try {
                // post实例塞参数的方法
                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        try {
            // 服务器返回的所有信息都在HttpResponse中, httpClient对象执行post请求,并返回响应参数对象
            httpResponse = httpClient.execute(httpPost);
            // 先取出服务器返回的状态码,如果等于200说明success
            int code =httpResponse.getStatusLine().getStatusCode();
            // 从响应对象中获取响应内容
            // EntityUtils.toString()有重载方法
            // 这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8即可
            HttpEntity entity = httpResponse.getEntity();
            result = EntityUtils.toString(entity,"UTF-8");
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != httpResponse) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
}

 

8. HttpClientに関するよく書かれたブログ:

ここに2つのリンクを入れてください: 

 
 

おすすめ

転載: blog.csdn.net/kqZhu/article/details/110881413