遠程調用webapi接口技術文檔
一、webapi接口
Webapi接口是一種使用json作爲存放服務端數據的載體,將服務端數據生成爲json,以json的形式存放,供外界調用,獲取數據。外界用戶需要獲取數據時,向webapi接口發起http請求,該請求一般是POST方式,因爲webapi需要存放,傳輸大量數據,所以一般使用POST方式接受用戶請求並響應;通過瀏覽器地址欄向webapi發出請求時,請求會失敗,因爲瀏覽器地址欄發出的是GET請求,請求的資源(webapi)不支持 http GET方法。所以瀏覽器一般無法直接訪問到該接口。可以使用postman插件來直接請求webapi資源。
二、基本思路
1、建立一個請求類,向webapi發起http POST請求;
2、用inputstream流接收webapi返回的json數據流;
3、將接收到的數據流生成json,(即將接收到的響應數據流生成json對象);
4、解析生成的json對象獲取數據;
三、具體實現
1、準備以下所必須的jar包:
2、建立實現類:
package hm.boiler.utils; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; import net.sf.json.JSONArray; import net.sf.json.JSONObject;
public class InvokWebApiUtil { private static HttpURLConnection conn; private static InputStream in; private static final String url = "http://127.0.0.1:8080/api/compeny/empc/empInfos";
//建立http連接 public static HttpURLConnection getHttpConn(String url) throws IOException{ URL neturl = new URL(url);//創建URL對象neturl,並將接口地址url傳給neturl對象 HttpURLConnection hconn = (HttpURLConnection) neturl.openConnection();//開啓連接 return hconn; }
//發送post請求 public static InputStream postRequest() throws Exception{ conn = getHttpConn(url); //設置請求頭 conn.setRequestProperty("Content-Type","application/json; charset=UTF-8");//請求類型 conn.setRequestProperty("Content-Length", "0");//內容長度 conn.setRequestMethod("POST");//請求方式爲post conn.setDoOutput(true);//post請求必須要加上 conn.setDoInput(true);conn.setDoOutput(true);這兩句代碼 conn.setDoInput(true);
//獲取conn對象的相應輸出流,設置發送請求參數 DataOutputStream os = new DataOutputStream(conn.getOutputStream()); os.write("".getBytes("UTF-8"),0,0); os.flush(); os.close(); conn.connect(); //開始獲取數據 in = conn.getInputStream(); return in; } //將接口返回數據轉化爲json對象 public static JSONObject stream2json() throws Exception{ BufferedReader rd = new BufferedReader(new InputStreamReader(postRequest(),Charset.forName("UTF-8"))); StringBuilder sb = new StringBuilder(); int cp; while((cp = rd.read()) !=-1){ sb.append((char) cp); } String jsonText = sb.toString(); JSONObject json = JSONObject.fromObject(jsonText); in.close(); return json; } //解析json並拿到熱值和灰份數據 public static double[] getQA() throws Exception { double[] values = new double[2]; //保存獲取到的數據 JSONObject json = stream2json(); //得到生成的json對象 JSONArray items =(JSONArray) json.get("root"); //獲取根節點 JSONObject Order1 = items.getJSONObject(0);//獲取第一個子節點(json對象) JSONArray Bunkers = (JSONArray)Order1.getJSONArray("rootc") //獲取第一個子節點下的子節點 JSONObject Bunkers1 = Bunkers.getJSONObject(BunkerID); // JSONArray Unit_BunkerCoals = Bunkers1.getJSONArray("rootc_t"); JSONObject Unit_BunkerCoals1 = Unit_BunkerCoals.getJSONObject(0); JSONObject Coal = Unit_BunkerCoals1.getJSONObject("Coal"); JSONObject CoalInfo = Coal.getJSONObject("CoalInfo"); QA[0] = CoalInfo.optDouble("value_a"); QA[1] = CoalInfo.optDouble("value_b"); conn.disconnect();//關閉連接 return QA;//返回獲取的數據 } } |
總結:json是以key-value的形式保存數據的,獲取數據時,拿到json對象,根據key取數據就可以。