目次
1.現在、JAVAがHTTPリクエストを実装するために最も使用する方法は2つあります。
第4に、HttpClientを使用する基本的な手順は次のとおりです。
1.現在、JAVAがHTTPリクエストを実装するために最も使用する方法は2つあります。
- これは、HTTPClientなどのサードパーティのオープンソースフレームワークを介して実装されます。HTTPClientのHTTPのカプセル化は非常に優れており、基本的にほとんどのニーズを満たすことができます。最新のHttpClient4.5は、org.apache.http.impl.clientの下でリモートURLを操作するためのツールキットです。HttpClient3.1はorg.apacheです。ツールキットcommons.httpclientでリモートURLを操作するためのコードは更新されなくなりましたが、作業でhttpClient3.1を使用するためのコードはまだたくさんあります。
- もう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
コンストラクタ
- URIBuilder()
- URIBuilder(final String string)は内部でURIオブジェクトを作成します:digestURI(new URI(string))
- 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つのリンクを入れてください: