java web api介面呼叫
Web Services 被W3C進行了標準化定義。
Web Services 釋出到網上,可以公佈到某個全域性登錄檔,自動提供服務URL,服務描述、介面呼叫要求、引數說明以及返回值說明。比如中國氣象局可以釋出天氣預報服務。所有其它網站或手機App如果需要整合天氣預報功能,都可以訪問該Web Service獲取資料。
Web Services 主要設計目標是提供公共服務。
Web Services 全部基於XML。按照W3C標準來描述服務的各個方面(引數、引數傳遞、返回值及服務釋出發現等)。要描述清楚Web Services標準的各個方面,可能需要2000頁的文件。
Web Services 還有標準的身份驗證方式(非公共服務時驗證使用者身份)。
輕量化的Web API
公司內部使用的私有服務,我們知道它的介面Url,因此不需要自動發現它。我們有它的服務介面文件,因此也不需要自動描述和自動呼叫。
即使Web Services的特性 官網:www.fhadmin.org(自動發現、自動學會呼叫方式)很美好,但私有服務往往不需要這些。
Web API一般基於HTTP/REST來實現,什麼都不需要定義,引數(輸入的資料)可以是JSON, XML或者簡單文字,響應(輸出資料)一般是JSON或XML。它不提供服務呼叫標準和服務發現標準。可以按你服務的特點來寫一些簡單的使用說明給使用者。
獲取遠端資料的方式正在從Web Services向Web API轉變。
Web Services的架構要比Web API臃腫得多,它的每個請求都需要封裝成XML並在服務端解封。因此它不易開發且吃更多的資源(記憶體、頻寬)。效能也不如Web API。
/**
* 根據指定url,編碼獲得字串 官網:www.fhadmin.org
*
* @param address
* @param Charset
* @return
*/
public static String getStringByConAndCharset(String address, String Charset) {
StringBuffer sb;
try {
URL url = new URL(address);
URLConnection con = url.openConnection();
BufferedReader bw = new BufferedReader(new InputStreamReader(con.getInputStream(), Charset));
String line;
sb = new StringBuffer();
while ((line = bw.readLine()) != null) {
sb.append(line + "\n");
}
bw.close();
} catch (Exception e) {
e.printStackTrace();
sb = new StringBuffer();
}
return sb.toString();
}
/**
* 通過post方式獲取頁面原始碼
*
* @param urlString
* url地址
* @param paramContent
* 需要post的引數
* @param chartSet
* 字元編碼(預設為ISO-8859-1)
* @return
* @throws IOException
*/
public static String postUrl(String urlString, String paramContent, String chartSet, String contentType) {
long beginTime = System.currentTimeMillis();
if (chartSet == null || "".equals(chartSet)) {
chartSet = "ISO-8859-1";
}
StringBuffer result = new StringBuffer();
BufferedReader in = null;
try {
URL url = new URL((urlString));
URLConnection con = url.openConnection();
// 設定連結超時
con.setConnectTimeout(3000);
// 設定讀取超時
con.setReadTimeout(3000);
// 設定引數
con.setDoOutput(true);
if (contentType != null && !"".equals(contentType)) {
con.setRequestProperty("Content-type", contentType);
}
OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), chartSet);
writer.write(paramContent);
writer.flush();
writer.close();
in = new BufferedReader(new InputStreamReader(con.getInputStream(), chartSet));
String line = null;
while ((line = in.readLine()) != null) {
result.append(line + "\r\n");
}
in.close();
} catch (MalformedURLException e) {
logger.error("Unable to connect to URL: " + urlString, e);
} catch (SocketTimeoutException e) {
logger.error("Timeout Exception when connecting to URL: " + urlString, e);
} catch (IOException e) {
logger.error("IOException when connecting to URL: " + urlString, e);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ex) {
logger.error("Exception throws at finally close reader when connecting to URL: " + urlString, ex);
}
}
long endTime = System.currentTimeMillis();
logger.info("post用時:" + (endTime - beginTime) + "ms");
}
return result.toString();
}
/**
* 傳送https請求 官網:www.fhadmin.org
* @param requestUrl 請求地址
* @param requestMethod 請求方式(GET、POST)
* @param outputStr 提交的資料
* @return JSONObject(通過JSONObject.get(key)的方式獲取json物件的屬性值)
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) throws Exception {
JSONObject json = null;
// 建立SSLContext物件,並使用我們指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 從上述SSLContext物件中得到SSLSocketFactory物件
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 設定請求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 當outputStr不為null時向輸出流寫資料
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意編碼格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 從輸入流讀取返回內容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 釋放資源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
json = JSON.parseObject(buffer.toString());
String errcode = json.getString("errcode");
if (!StringUtil.isBlank(errcode) && !errcode.equals("0")) {
logger.error(json.toString());
throw new SysException("ERRCODE:"+ errcode);
}
return json;
}
}