被別人遠程調用和自己遠程調用別人接口的理解:
被別人調用接口:其實沒有什么神秘的,就是我們寫一個正常的方法提供一個訪問路徑。
調用別人的接口:本質時一個Request請求,實際要使用到javax.net.*包里的URL/ HttpURLConnection等相關的方法。
簡單的一個接口實例:
我使用的框架是Spring mvc
被調用的接口方法:
1/創建Response的工具類
package com.gsww.sxzz.controller.service; import java.io.IOException; import javax.servlet.http.HttpServletResponse; /** * 接口json格式的工具幫助類 * @author GuoPC * @date 2017-05-31 * */ public class ResponseUtils { /** * 響應的返回json的方法 * @param response * @param text */ public static void renderJson(HttpServletResponse response,String text) { render(response,"text/json;charset=UTF-8",text); } /** * 設置響應相關的Header信息 * @param response * @param contentType * @param text */ public static void render(HttpServletResponse response,String contentType,String text){ //設置響應的頭信息,具體請參考response對象 response.setContentType(contentType); response.setCharacterEncoding("utf-8"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); try{ response.getWriter().write(text); }catch(IOException e){ } } }
創建實際被調用的方法:
/** * 單點登陸接口 * @author GuoPC *@date 2017-05-031 */ @Controller @RequestMapping("/login") public class LoginService { /** * 單點登陸接口用於校驗平台發送過來的校驗碼 * 請求方式為HTTP POST * 返回為json格式數據 * @param userCode 用戶登錄ID * @param userPwd 用戶登錄密碼(32位MD5值) * @param appCode 應用編碼(由平台端統一生成) */ @RequestMapping(value="/loginService",method = RequestMethod.POST) public void loginService(HttpServletRequest request,HttpServletResponse response){ /*使用request獲取參數*/ String userCode=request.getParameter("userCode"); String userPwd=request.getParameter("userPwd"); String appCode=request.getParameter("appCode"); //創建map Map<String,String> map=new HashMap<String,String>(); JSONObject json=null; //判斷參數是否傳遞 if(userCode!=null && userPwd!=null && appCode!=null){ if(userCode.equals("gyn") && userPwd.equals("gyn") && appCode.equals("1")){ //校驗成功返回成功的參數信息 map.put("expires_in", "7200"); map.put("access_token", "接口成功"); //轉換json json=JSONObject.fromObject(map); }else{ //校驗失敗返回成功的參數信息 map.put("expires_in", "7100"); map.put("access_token", "接口失敗"); json=JSONObject.fromObject(map); } }else{ //校驗失敗返回成功的參數信息 map.put("expires_in", "7000"); map.put("access_token", "存在為null的參數"); json=JSONObject.fromObject(map); } //返回json數據 ResponseUtils.renderJson(response, json.toString()); } }
因為使用的是POST請求,在流量其地址欄輸入會出現如下信息。請求方法不正確。
HTTP Status 405 - Request method 'GET' not supported
type Status report
message Request method 'GET' not supported
description The specified HTTP method is not allowed for the requested resource.
Apache Tomcat/8.5.9
我們繼續寫請求的實例:
/** * 單點登陸接口 * * @author GuoPC * @date 2017-05-031 */ public class LoginService { public static void main(String[] args) throws IOException { //創建訪問路徑 URL url=new URL("http://127.0.0.1:8080/sxzz/login/loginService?userCode=gyn&userPwd=gyn&appCode=1"); //打開訪問路徑 HttpURLConnection conn=(HttpURLConnection)url.openConnection(); //設置訪問的方式如下 /*•GET 常用:在只是獲取數據信息時使用 •POST 常用:在需要傳遞信息時使用 •HEAD •OPTIONS •PUT •DELETE •TRACE */ conn.setRequestMethod("POST"); //將此 URLConnection 的 doInput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸入,則將 DoInput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 true。 conn.setDoInput(true); //關鍵點:如果conn.setDoOutput(true)請求方法必須為POST //將此 URLConnection 的 doOutput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸出,則將 DoOutput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 false。 conn.setDoOutput(true); conn.setInstanceFollowRedirects(true); /*conn.setRequestProperty("Accept", "application/json");*/ /*設置一般請求屬性。如果已存在具有該關鍵字的屬性,則用新值改寫其值。 注:HTTP 要求所有能夠合法擁有多個具有相同鍵的實例的請求屬性,使用以逗號分隔的列表語法,這樣可實現將多個屬性添加到一個屬性中。 參數: key - 用於識別請求的關鍵字(例如," accept")。 value - 與該鍵關聯的值。*/ conn.setRequestProperty("content-type", "text/json"); conn.connect(); OutputStream os=conn.getOutputStream(); os.flush(); os.close(); //獲取連接的輸入流信息 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line=null; //獲取得到輸入流,並打印到控制台 while((line=br.readLine())!=null){ System.out.println(line); } br.close(); isr.close(); is.close(); } }
測試結果:
在補充下GET方式的請求:
/** * URL類封裝的訪問接口連接 * @return StringBuffer * @throws IOException */ public StringBuffer sendURLPost() throws IOException{ //創建訪問路徑 URL url=new URL("http://127.0.0.1:8080/sxzz/login/loginService?userCode=gyn&userPwd=gyn&appCode=1"); //打開訪問路徑 HttpURLConnection conn=(HttpURLConnection)url.openConnection(); //設置訪問的方式如下 /*•GET 常用:在只是獲取數據信息時使用 •POST 常用:在需要傳遞信息時使用 •HEAD •OPTIONS •PUT •DELETE •TRACE */ conn.setRequestMethod("POST"); //將此 URLConnection 的 doInput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸入,則將 DoInput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 true。 conn.setDoInput(true); //關鍵點:如果conn.setDoOutput(true)請求方法必須為POST //將此 URLConnection 的 doOutput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸出,則將 DoOutput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 false。 conn.setDoOutput(true); conn.setInstanceFollowRedirects(true); conn.setRequestProperty("Accept", "text/json"); /*設置一般請求屬性。如果已存在具有該關鍵字的屬性,則用新值改寫其值。 注:HTTP 要求所有能夠合法擁有多個具有相同鍵的實例的請求屬性,使用以逗號分隔的列表語法,這樣可實現將多個屬性添加到一個屬性中。 參數: key - 用於識別請求的關鍵字(例如," accept")。 value - 與該鍵關聯的值。*/ conn.setRequestProperty("content-type", "text/json"); conn.connect(); OutputStream os=conn.getOutputStream(); os.flush(); os.close(); //獲取連接的輸入流信息 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line=null; //創建返回對象,必須使用new創建對象初始化 StringBuffer sb = new StringBuffer(); //獲取得到輸入流,並打印到控制台 while((line=br.readLine())!=null){ //獲取返回的值 sb.append(line); } br.close(); isr.close(); is.close(); return sb; } /** * URL類封裝的訪問接口連接 * @return StringBuffer * @throws IOException */ public StringBuffer sendURLGet() throws IOException{ //創建訪問路徑 URL url=new URL(this.http+"://"+this.host+":"+this.port+"/"+this.url+"?"+this.params); //打開訪問路徑 HttpURLConnection conn=(HttpURLConnection)url.openConnection(); //設置訪問的方式如下 /*•GET 常用:在只是獲取數據信息時使用 •POST 常用:在需要傳遞信息時使用 •HEAD •OPTIONS •PUT •DELETE •TRACE */ conn.setRequestMethod("GET"); //將此 URLConnection 的 doInput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸入,則將 DoInput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 true。 conn.setDoInput(true); //關鍵點:如果conn.setDoOutput(true)請求方法必須為POST //將此 URLConnection 的 doOutput 字段的值設置為指定的值。 //URL 連接可用於輸入和/或輸出。如果打算使用 URL 連接進行輸出,則將 DoOutput 標志設置為 true;如果不打算使用,則設置為 false。默認值為 false。 /*conn.setDoOutput(true);*/ conn.setInstanceFollowRedirects(true); conn.setRequestProperty("Accept", "text/json"); /*設置一般請求屬性。如果已存在具有該關鍵字的屬性,則用新值改寫其值。 注:HTTP 要求所有能夠合法擁有多個具有相同鍵的實例的請求屬性,使用以逗號分隔的列表語法,這樣可實現將多個屬性添加到一個屬性中。 參數: key - 用於識別請求的關鍵字(例如," accept")。 value - 與該鍵關聯的值。*/ conn.setRequestProperty("content-type", "text/json"); conn.connect(); /*OutputStream os=conn.getOutputStream(); os.flush(); os.close();*/ //獲取連接的輸入流信息 InputStream is=conn.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line=null; //創建返回對象,必須使用new創建對象初始化 StringBuffer sb = new StringBuffer(); //獲取得到輸入流,並打印到控制台 while((line=br.readLine())!=null){ //獲取返回的值 sb.append(line); } br.close(); isr.close(); is.close(); return sb; }
使用get方式請求是不可設置下面選項為true:
conn.setDoOutput(true);
同樣下面的對象也不可以使用
OutputStream os=conn.getOutputStream();
os.flush();
os.close();
setDoOutput是設置請求的輸出流為true。理解下get方式請求就明白了,get只是獲取連接的數據信息,不需要像對方輸出數據信息。只需要獲取請求方的輸入數據就可以了。
Get方式的輸出結果:
總結:
此列接口的實際意義就是:Request和Response連個對象的使用,這部分要是學的夠精通,作起來還是很好理解的,在基礎一些就是使用到了Socket套接字的內容。URL和HttpURLConnection可能就是封裝了Socket。
這只是個人理解,如果有大牛看出錯誤,還請多多指點。