1. 程式人生 > >java web api介面呼叫

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;
    }

}