使用Java呼叫REST介面時設定超時時間
阿新 • • 發佈:2018-12-31
關於在Java中呼叫REST介面,首先來說一下JAX-RS。
JAX-RS是JAVA EE6 引入的一個新技術。JAX-RS即Java API for RESTful Web Services,是一個Java 程式語言的應用程式介面,支援按照表述性狀態轉移(REST)架構風格建立Web服務。JAX-RS使用了Java SE5引入的Java註解來簡化Web服務的客戶端和服務端的開發和部署。
Java源生JAX-RS使用方式
Java提供的JAX-RS本身就可以實現調介面的功能,使用比較簡單,但是我目前還沒發現怎麼設定超時時間,使用的程式碼如下:
package com.util; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class TestC { /** * * @param url 請求地址 * @param postParam 引數 * @param mediaType 媒體型別 * @return */ public static String post(String url, String postParam, MediaType mediaType) { Client client = ClientBuilder.newClient(); String result = null; WebTarget target = client.target(url); Response response = target.request().post(Entity.entity(postParam, mediaType)); try { if (response.getStatus() != 200) { throw new RuntimeException("Failed with HTTP error code : " + response.getStatus()); } result = response.readEntity(String.class); } catch (Exception e) { e.printStackTrace(); } finally { response.close(); client.close(); } return result; } }
除了Java本身的JAX-RS之外,還有很多別的框架,有的擴充套件了Java的JAX-RS,有的使用http連線的方式,都能實現調介面的目的,而且功能更加強大,下面舉例兩種,分別是Apache的HttpClient和Spring的RestTemplate,都是可以設定超時時間的。
Apache的HttpClient
使用程式碼如下:
package com.util; import org.apache.http.HttpEntity; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; public class TestA { /** * * @param url 請求地址 * @param param 引數 * @param mediaType 媒體型別值 * @param connectTimeout 連線超時時間,單位是毫秒,設定為0表示不限長 * @param readTiemout 呼叫超時時間,單位是毫秒,設定為0表示不限長 * @return */ public String postWithTimeout(String url, String param,String mediaType, int connectTimeout, int readTiemout) { String result = null; HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); try { httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectTimeout);// 設定建立連線超時時間 httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, readTiemout);// 設定等待返回超時時間 StringEntity entity = new StringEntity(param); entity.setContentEncoding("UTF-8"); entity.setContentType(mediaType); httpPost.setEntity(entity); HttpEntity resEntity = httpClient.execute(httpPost).getEntity(); result = EntityUtils.toString(resEntity, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } finally { httpClient.getConnectionManager().shutdown(); } return result; } }
Spring的RestTemplate
使用程式碼如下:
package com.util; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; public class TestB { /** * * @param url 請求地址 * @param param 引數 * @param mediaType 媒體型別值 * @param connectTimeout 連線超時時間,單位是毫秒,設定為0表示不限長 * @param readTiemout 呼叫超時時間,單位是毫秒,設定為0表示不限長 * @return */ public static String postWithTimeout(String url, String body, String mediaType, int connectTimeout, int readTiemout) { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(connectTimeout);// 設定建立連線超時時間 requestFactory.setReadTimeout(readTiemout);// 設定等待返回超時時間 RestTemplate restTemplate = new RestTemplate(requestFactory); HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType(mediaType); headers.setContentType(type); headers.add("Accept", "text/html,application/xhtml+xml,application/json;q=0.9,*/*;q=0.8"); headers.add("Content-Length", "0"); HttpEntity<String> formEntity = new HttpEntity<String>(body, headers); String temp = restTemplate.postForObject(url, formEntity, String.class); return temp; } }
Spring的RestTemplate和Apache的HttpClient一樣,可以設定建立連線的超時時間,和等待伺服器返回的超時時間,這兩個超時時間的單位都是毫秒,如果設定為0,表示沒有超時時間。
他們也都支援get,post等請求方式,比Java源生的JAX-RS功能要豐富一些
實際上RestTemplate也是使用了HttpClient的原理,而HttpClient就是擴充套件自Java的JAX-RS。
其他的框架如Jersey等,也可以實現以上類似的功能,這種框架有很多,可以慢慢學習。