http訪問是java經常使用的。一般有三種請求方式。
- java原生的HttpURLConnection
- HTTPClient3(commons-httpclient) 第三方框架
- HTTPClient4.5(apache.httpclient)
HttpURLConnection傳入參數用OutputStream(傳參使用aa=bb樣式),取返回值用InputStream,請求頭setRequestProperty()
public static void doPost(String url){
HttpURLConnection connection = null;
String params = "param=zhangsan";
try {
URI uri = new URI(url);
connection = (HttpURLConnection)uri.toURL().openConnection();
//設置講求時長
connection.setConnectTimeout(2000);
//設置讀的時間
connection.setReadTimeout(1000);
//get請求傳入GET
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
//設置是否將數據寫入鏈接
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(params.getBytes());
outputStream.flush();
outputStream.close();
//發起請求
connection.connect();
if(connection.getResponseCode() == 200){
InputStream inputStream = connection.getInputStream();
byte[] bytes = new byte[1024];
inputStream.read(bytes);
System.out.println(new String(bytes,"utf-8"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
httpClient3.1請求頭使用setRequestHeader(),參數使用addParameter(),返回值還是使用InputStream
public static void doPost(String url, Map<String, String> params) {
//創建HttpClient實例
HttpClient httpClient = new HttpClient();
//設置httpClient連接主機服務器的超時時間
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(2000);
//創建Post請求方法實例
PostMethod post = new PostMethod(url);
post.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
//設置Post請求時長
post.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 2000);
post.addParameter("param", "lisi");
try {
int statuCode = httpClient.executeMethod(post);
if (200 == statuCode) {
InputStream responseBodyAsStream = post.getResponseBodyAsStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(responseBodyAsStream));
String team = null;
while ((team = bufferedReader.readLine()) != null) {
System.out.println(team);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
httpClient4.5請求頭使用setHeader(),傳入參數使用setEntity(),返回參數又進行了封裝直接使用httpResponse.getEntity()
public static void doPost(String url, Map<String, String> params) {
//通過默認配置創建個HttpClient實例
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse httpResponse = null;
//創建httpPost遠程實例
HttpPost post = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(2000)//連接主機服務超時時間
.setConnectionRequestTimeout(2000)//連接請求超時時間
.setSocketTimeout(2000)//讀取數據超時時間
.build();
//爲httpPost實例設置配置(get請求httpGet)
post.setConfig(requestConfig);
//設置請求頭
post.setHeader("Content-Type", "application/json;charset=UTF-8");
//迭代請求參數map
List<NameValuePair> nvps = new ArrayList<>();
params.forEach((m, v) -> {
nvps.add(new BasicNameValuePair(m, v));
});
//爲httpPost設置封裝好的請求參數
try {
post.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
//httpClient對象執行Post請求,並返回響應對象
httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
System.out.println(EntityUtils.toString(entity));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉資源
if (null != httpResponse) {
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != client) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在java中url和uri的區別?
uri:表示統一資源標識符引用
url:和般表示網絡資源
url = uri.toUrl()