java的遠程訪問接口的實例


被別人遠程調用和自己遠程調用別人接口的理解:

被別人調用接口:其實沒有什么神秘的,就是我們寫一個正常的方法提供一個訪問路徑。

調用別人的接口:本質時一個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。

這只是個人理解,如果有大牛看出錯誤,還請多多指點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM