被别人远程调用和自己远程调用别人接口的理解:

被别人调用接口:其实没有什么神秘的,就是我们写一个正常的方法提供一个访问路径。

调用别人的接口:本质时一个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。

这只是个人理解,如果有大牛看出错误,还请多多指点。

java的远程访问接口的实例的更多相关文章

  1. Java Stream 函数式接口外部实例的引用

    Java Function Interface 函数式接口: Stream.empty() .filter(Predicate) .map(Function) .forEach(Consumer); ...

  2. 转载:Java的接口及实例

    转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...

  3. 转:十九、Java的接口及实例

    http://blog.csdn.net/liujun13579/article/details/7736116 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合 ...

  4. Java的接口及实例

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

  5. 如何让Java和C++接口互相调用:JNI使用指南

    如何让Java和C++接口互相调用:JNI使用指南 转自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos ...

  6. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  7. JNI的替代者—使用JNA访问Java外部功能接口

    摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...

  8. Java NIO Path接口和Files类配合操作文件

    Java NIO Path接口和Files类配合操作文件 @author ixenos Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路 ...

  9. Java中 Comparator接口 与Comparable 的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...

随机推荐

  1. Spring 中的Null-Safety

    之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时也没有在意到底是什么意思,所以这篇文章来谈谈Spring中关于Null的那些事. 在Java中不允许让你使用类型表示其null的安全 ...

  2. Ocelot --API网关简单使用

    最近几个月一直在忙一个项目(感觉像是与世隔绝了),本来想好的是要写一些asp.net core 的一些简单使用上东西,也就放下了. 好在忙完了,也就重新开始写吧.写点什么呢?网上也有不少dotnet ...

  3. 01 Memcached 安装与介绍

      一:Memcached 介绍 ()官网网址:www.mamcached.org () 主要功能是:高性能,分布式的内存对象缓存系统. ()Nosql不仅仅是关系型数据库,显著特点key value ...

  4. Selenium 应用 WebDriverWait 和 expected_conditions(待验证)

    收藏在我的收藏看不到,只能copy了,转载至http://www.cnblogs.com/yicaifeitian/p/4749149.html 哈哈,我始终相信贴出来总会有人看.WebDriverW ...

  5. 多媒体开发之--- rtsp 中的H264 编码+打包+解码相关知识es、pes、ts...

    1)ES流(Elementary Stream): 也叫基本码流,包含视频.音频或数据的连续码流. 2)PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的 ...

  6. 【Unity 3D】学习笔记四十二:粒子特效

    粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起.来模拟火焰,爆炸.水滴,雾气等效果. 要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system就可 ...

  7. java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttacher any more.

    java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttach ...

  8. 软件测试人员需要精通的开发语言(2)--- SQL

    简单的入门语言vbs,通过实例的练习以及简单的应用,基本可以掌握vbs脚本的使用.如果说vbs只是为了实际测试中开发脚本,便捷测试的目的.那SQL语言就是测试人员的必备技能了,任何系统都会用到数据库, ...

  9. 【BZOJ3784】树上的路径 点分治序+ST表

    [BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a< ...

  10. 序列DP(输出有要求)

    DP Time Limit:10000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status De ...