远程调用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取数据就可以。