Java开发服务端网络接口
- RESTful接口
- 服务端提供RESTful接口及代码示例
- 各种请求方式及应用场景
- 接口传入参数的方式
- Get接口传入的参数
- Post接口传入的参数
- Put接口传入参数
- Delete接口传入参数
- 接口返回参数的方式
- 接口返回码及含义
- Get接口
- Post接口
- Put接口
- Delete接口
- 幂等的概念
- Get(查询)
- 服务端提供的Get接口开发示例
- Post(新增)
- Put(更新修改)
- POST和PUT的区别
- Delete(删除)
- PATCH
- HEAD
- OPTIONS
- RPC接口
- RMI接口
- 不同工程开发不同风格的网络接口代码示例
- 使用JEECG的jwt开发restful风格接口
- 开发步骤
- 枚举类InterfaceEnum中定义接口编码
- 具体步骤如下:
- 接口的地址
- 向restful接口传入多个参数的情况
- JEECG开发restful接口
- 基本流程
- 图例
- 优点
- 安全相关
- Java开发webservices风格接口
- 开发步骤
- 配置spring-mvc.xml文件
- 文件在工程中的位置
- 配置web.xml文件
- 文件在工程中的位置
- 配置cxf-servlet.xml文件
- 文件在工程中的位置
- 编写接口
- 发布接口
- 发布接口的访问路径
- 发布接口成功的标志
- 注意事项
- Java开发restful风格接口
- 官方说明文档
- 接口开发中需要的注解
- @RequestMapping("/delivery")
- 接口开发中需要注意的事项
- SpringMVC工程开发接口
- JEECG表单对外接口
- 官方说明文档
- 接口开发中的注意事项
- 统一接口响应体的格式规范
- 检查调用接口人员的权限
- 接口加密
- 接口测试
- 方法一:直接在接口的服务器工程中新建一客户端
- 控制台窗口
- 返回的信息
- 错误信息
- 成功获取token
- 同一工程中开发前端和后端,用前端来调用后端进行测试
- 方法二
- 方法三
RESTful接口
REST 是Representational State Transfer
的缩写,翻译是”表现层状态转化”。更简单地说就是,在 Restful 风格中,用户请求接口使用同一个url,而对请求资源要进行不同的操作则通过不同的请求方式(get、post、delete、put等等)进行区分,这样可以在前后台分离式的开发中,使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。
RESTful是一种网络应用程序的设计风格和开发方式,并没有一个明确的标准。REST 指的是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是 RESTful。基于HTTP,可以使用XML格式定义或JSON格式定义。面向资源是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器 上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。
RESTful适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为【新增、变更、删除】所调用资源。
7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
服务端提供RESTful接口及代码示例
各种请求方式及应用场景
1、POST /url 创建
2、DELETE /url/xxx 删除
3、PUT /url/xxx 更新
4、GET /url/xxx 查询
如果URL可以在客户端确定,那么可使用PUT,否则用POST。
接口传入参数的方式
Get接口传入的参数
@RequestParam(value = "startTime", defaultValue = "2023-03-22_16:39:35.106")
:通过@RequestParam
注解来标识Get接口的每一个传入参数,Get接口用于接收Java的基本数据类型。
Post接口传入的参数
@RequestBody
:通过@RequestBody
注解来标识【接收字节流形式的类对象】参数,Post接口用于接收Java的自定义类的对象。(比如自定义类的对象,若是上传文件,也将文件赋值给该类对象的其中一个属性?)
Put接口传入参数
Delete接口传入参数
接口返回参数的方式
以json格式返回接口运行结果,比如使用net.sf.json.JSONObject
,net.sf.json.JSONObject
的使用方法详见此博客。
接口返回码及含义
标准的http状态码有五类,分别是:
- 1xx: 通知
- 2xx: 成功
- 3xx: 重定向
- 4xx: 客户端错误
- 5xx: 服务端错误
有的博客提到“对于客户端来讲,只需要在业务代码里处理2xx,4xx的状态码即可,因为1xx和3xx对开发者是透明的,http调用框架(ajax、retrofit、axios等等)会自动处理;而5xx是后端的问题,不需要客户端做什么调整”,待确认。
Get接口
200(OK) - 表示已在响应中发出
204(无内容) - 资源有空表示
301(Moved Permanently) - 资源的URI已被更新 303(See Other) - 其他(如,负载均衡)
304(not modified)- 资源未更改(缓存)
400 (bad request)- 指代坏请求(如,参数错误) 404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
Post接口
200(OK)- 如果现有资源已被更改
201(created)- 如果新资源被创建
202(accepted)- 已接受处理请求但尚未完成(异步处理) 301(Moved Permanently)- 资源的URI被更新
303(See Other)- 其他(如,负载均衡)
400(bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突) 415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
Put接口
200 (OK)- 如果已存在资源被更改
201 (created)- 如果新资源被创建
301(Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他(如,负载均衡)
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突) 415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
Delete接口
200 (OK)- 资源已被删除
301 (Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他,如负载均衡
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
409 (conflict)- 通用冲突
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
幂等的概念
接口幂等性,幂等即多次(幂)运行之后结果仍然相同,就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。自认,是指当本次请求过程中出现错误、失败时,会回退至运行之前,不会对下次造成任何影响;只有本次请求成功,当次才会真正运行至结束,比如数据库事务。
其他博客中给出的例子——比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...,这就没有保证接口的幂等性
Get(查询)
安全且幂等,表示获取。@RequestParam用来接收字节流形式的Java基本类型参数,与Post接口接收的类对象参数相对
服务端提供的Get接口开发示例
@RequestMapping("/getTree")
@ResponseBody//将返回信息转变为字节流,之所以要加此注解,是为了区别返回值是通过网络返回给用户,还是将值传给下一个方法继续在本地处理。
public JSONObject getExperimentTreeController(@RequestParam(value = "startTime", defaultValue = "2023-03-22_16:39:35.106") String startTime,, HttpServletRequest request)
//@RequestParam用来接收字节流形式的Java基本类型参数;HttpServletRequest request用来获取当前请求的url、cookie等信息,比如Cookie[] cookies = request.getCookies();
会向数据库索取数据,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改内容、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的,类似于数据库的select操作。
有博客提到,带并入本文【“GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。”
“POST把提交的数据则放置在是HTTP包的包体中”。
“POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。”】
Post(新增)
不安全且不幂等,使用服务端管理的(自动产生)的实例号创建资源、子资源。@RequestBody用来接收字节流形式的类对象参数
@RequestMapping("/editList")
@ResponseBody//将返回信息转变为字节流
public JSONObject editOrderListController(@RequestBody JSONObject json, HttpServletRequest request)
//@RequestBody用来接收字节流形式的类对象参数(比如自定义类的对象,若是上传文件,也将文件赋值给该类对象的其中一个属性?),HttpServletRequest request用来获取当前请求的url等信息
也是向服务器端发送数据的,但是该请求会改变数据的种类等资源,类似于数据库的insert操作,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
Put(更新修改)
不安全但幂等,通过替换的方式更新资源。如果未被修改,则更新资源(乐观锁)。
会向服务器端发送数据,从而改变信息,该请求就像数据库的update操作一样,只修改数据的内容,不增加数据的种类等,也就是说无论进行多少次PUT操作,只会改编数据的取值,而不会变更数据的结构,类似于数据库的update操作。
POST和PUT的区别
也正因为如下,虽然二者均向服务器发送数据,但是PUT因为只更新数据的内容,而不增加新的数据类型,所以PUT主要作用在一个具体资源之上的(url/xxx);而POST因为若没有对应的数据类型,会添加数据种类,所以主要作用在一个集合资源之上的(url)。
Delete(删除)
不安全但幂等,删除资源
用来删除某一个资源,类似于数据库的delete操作。
PATCH
HEAD
OPTIONS
RPC接口
RMI接口
不同工程开发不同风格的网络接口代码示例
restful设计风格接口和webservice接口,restful风格(两要素:把每个接口看作一个资源,每个资源都有唯一标识,即URL;对于统一资源不同行为,用http-method来表示)将将每一个接口当做一个资源,要保证资源的唯一性。
使用JEECG的jwt开发restful风格接口
REST是Representational State Transfer的缩写,翻译是”表现层状态转化”。
面向资源是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器 上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。
在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put…等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。
在Restful风格中,有如下规定:
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。 POST(CREATE):在服务器新建一个资源,调用insert操作。 PUT(UPDATE):在服务器更新资源,调用update操作。 PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。(目前jdk7未实现,tomcat7也不行)。 DELETE(DELETE):从服务器删除资源,调用delete语句。
举个例子:如果当前url是 http://localhost:8080/User那么用户只要请求这样同一个URL就可以实现不同的增删改查操作,例如
http://localhost:8080/User?_method=get&id=1001 这样就可以通过get请求获取到数据库 user 表里面 id=1001 的用户信息
http://localhost:8080/User?_method=post&id=1001&name=zhangsan 这样可以向数据库 user 表里面插入一条记录
http://localhost:8080/User?_method=put&id=1001&name=lisi 这样可以将 user表里面 id=1001 的用户名改为lisi
http://localhost:8080/User?_method=delete&id=1001 这样用于将数据库 user 表里面的id=1001 的信息删除
这样定义的规范我们就可以称之为restful风格的API接口,我们可以通过同一个url来实现各种操作。
开发步骤
在JEECG中实现一个接口,无需关注token的鉴权机制,需要实现以下步骤:
(1)开发restful接口对应的controller类及接口方法。
(2)给controller类和对应的接口方法,分别添加注解@RequestMapping("/paperfile")
,如下图所示。
(3)枚举类InterfaceEnum中定义接口编码
在JEECG工程中org.jeecgframework.web.system.enums包下的InterfaceEnum文件中定义开发好的接口方法。该方法的构造函数及各个参数的含义,详见下文。通过此文件来将开发的controller与JEECG中配置的接口关联起来
枚举类InterfaceEnum中定义接口编码
首先在jeecg工程中找到InterfaceEnum所在位置:在org.jeecgframework.web.system.enums.InterfaceEnum
包内
InterfaceEnum类中的构造方法为
private InterfaceEnum(String code, String name, String url, String method, Integer sort)
,如下图所示,
将开发的接口,通过上图的构造方法,声明在InterfaceEnum中。与其他声明在此的接口,以,
相隔,如下图所示。其中,deliverfile("deliverfile",
均为JEECG后台——接口权限管理——的录入/编辑接口权限时设置的“接口权限编码”。
InterfaceEnum中构造方法各参数的含义,如下所示。
(4)JEECG后台中,需要对开发好的接口进行对应的配置,在JEECG工程后台启动服务器程序,进行接口权限的管理,把自己的接口写进去。后台配置中的接口权限编码为InterfaceEnum中定义的接口编码,如下图所示。
进行到此处,恭喜,JEECG的jwt接口开发已经顺利完成,通过下图代码,就可以访问开发好的controller中的方法接口了。其中,调用开发好的接口地址为http://localhost:8080/jeecg/rest/paperfile/delivery
,paperfile/delivery
为注解@RequestMapping("/paperfile")
中设置的controller和接口方法的地址。此外,还要注意的是,传入的所有参数要以对象的形式,转换成json格式,传入接口,如下图所示。
(5)在开发完成的接口中,调用InterfaceUtil工具类getInterfaceRuleDto获取接口权限,验证是否有访问权限,如果无相应权限则返回消息,并结束接口进程。
TSInterfaceServiceI interfaceService = ApplicationContextUtil.getContext().getBean(TSInterfaceServiceI.class);
InterfaceRuleDto interfaceRuleDto = interfaceService.getInterfaceRuleByUserNameAndCode(deliveryfileEntity.getOperatorName(),InterfaceEnum.deliverfile);
//返回信息为空,表示该人员没有权限
if(interfaceRuleDto == null) return Result.error("你没有该接口的权限");
(6)根据获取的数据权限,组装查询条件返回接口数据,如下图所示。
此处要注意的是,在对CriteriaQuery做好配置后,还需要调用this.jeecgDemoService.getDataGridReturn(query, true);
来获取查询结果。
具体步骤如下:
1.左侧导航栏,接口权限管理,新建的接口——接口权限录入;已有的接口——接口权限编辑。
2.左侧导航栏,接口角色管理
3.在InterfaceEnum中添加接口信息
名称是要跟服务器端添加的接口名称保持一致。
接口的地址
接口配置完成后,访问地址为:http://localhost:8080/jeecg/rest/paperfile/delivery
,即http://localhost:8080/工程名/rest/@RequestMapping("/配置的controller名")/@RequestMapping("/配置的接口实现方法名")
。
向restful接口传入多个参数的情况
按照这篇博客,并结合目前自己这段时间以来的开发经历,restful接口貌似只能穿单个对象= =,而且该对象还要转换为json格式后,才能顺利传入接口并调用,待进一步确认。
采用Json web token (JWT)机制,基于token的鉴权机制,来保证接口的使用安全。JWT验证用的token采用redis进行缓存,redis.properties文件是配置文件。此处先给出官网接口文档。
接口调用使用http协议,restful请求方式。
JEECG开发restful接口
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端保留用户的认证信息或者会话信息,而是将验证用的token存在请求的客户端的本地主机上,从而使得基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
基本流程
(1)用户使用用户名密码来请求服务器
(2)服务器进行验证用户的信息
(3)服务器通过验证发送给用户一个token
(4)客户端存储token,并在每次请求时附送上这个token值(存在head里的参数X-AUTH-TOKEN)
(5)服务端验证token值,并返回数据
图例
优点
- 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
- 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
- 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
- 它不需要在服务端保存会话信息, 所以它易于应用的扩展
安全相关
- 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
payload:
Java开发webservices风格接口
目前使用JEECG工程进行webservice接口的开发工作,开发流程 总结如下。
RESTful接口服务和WebService接口服务(的区别?)
开发步骤
推荐这篇博客,讲解的很详细。
配置spring-mvc.xml文件
如果spring-mvc.xml文件中有此语句,记得检查解除注释;如果没有配置,则将此语句添加进spring-mvc.xml文件,如下图所示。
文件在工程中的位置
直接就在src文件夹下。
配置web.xml文件
在文件中加入CXF的Endpoint,并配置相关信息,如下图所示。
文件在工程中的位置
在——与src同级——WebRoot内的,WEB-INF文件夹下。
配置cxf-servlet.xml文件
其中,的id填写“接口的名称”,后面的class填写“接口实现类的路径和名称”;
<jaxws:endpoint …/>中填写“#接口的名称”,address中填写的是接口访问的路径。
文件在工程中的位置
在——工程的一级目录——与src同级的——webRoot文件夹下的WEB-INF包下。
编写接口
- 先编写interface类,代码如下图所示。
package com.webservice.controller;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String say(String str);
}
- 再编写接口实现类
package com.webservice.controller;
import javax.jws.WebService;
@WebService
public class HelloWorldImpl implements HelloWorld {
@Override
public String say(String str) {
// TODO Auto-generated method stub
return "hello" + str;
}
}
此处需要注意的是,虽然声明接口时已经加了@webservice
注解,但是接口实现类同样需要需要添加@webservice
注解,如上图所示。否则会出现如下所示的错误。
发布接口
新建一个包含主函数的类,使用Endpoint.publish方法,作为webservice的发布器,代码如下。运行此文件,即可发布配置好的接口。
发布接口的访问路径
http://localhost:8080/工程名/【servlet配置的路径,如下图所示】/【cxf-servlet.xml文件中配置的接口访问路径,如“开发步骤”的第二步“配置cxf-servlet.xml文件”截图红框中“address”配置的地址所示】?wsdl
例如,本文中自己开发接口的路径应为http://localhost:8080/jeecg-nomaven/servlet/AxisServlet/HelloWorld?wsdl
发布接口成功的标志
运行项目,如果成功,eclipse会在控制台显示“发布webservice成功”的信息,如下图所示。
随后访问http://localhost:8080/jeecg-nomaven/servlet/AxisServlet/HelloWorld?wsdl,看到如下界面,恭喜,开发成功!
注意事项
- 在WebService服务发布以后,即使在底部控制台的server服务器选项卡关闭服务器,也不会关闭WebService服务,其仍会占用端口,需要在底部控制台的Console选项卡才能关闭。
- WebService与restful接口无法同时启动,因为共同占用一个端口。只能关掉一个,才能打开另一个。
Java开发restful风格接口
将自己一开始的经验总结在此
官方说明文档
接口开发中需要的注解
@RequestMapping(“/delivery”)
接口开发中需要注意的事项
- 传入参数,应尽可能精简。
- 在运行业务逻辑前,要进行必要的参数检查,比如判空。
- 接口开发中,将多个对象的属性值传递给一个新对象,尽量不要使用构造函数的方式。
- JEECG工程中,使用自定义类型作为接口传入参数时,需要提供默认(无参)构造方法,否则调用接口时传入的参数,接口获取不到。
SpringMVC工程开发接口
使用@RequestMapping()前,要现在spring-mvc配置文件上添加<mvc:annotation-driven />
,使用后会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter 这两个bean,是spring MVC为@Controllers分发请求所必须的,即解决了@Controller注解使用的前提配置。
JEECG表单对外接口
官方说明文档
online表单对外接口的官方文档和Online表单对外接口。
此处先给出官方文档。
看这篇博客时,自认上面“online表单对外接口的官方文档”中使用的id来源于表单配置中的id
接口开发中的注意事项
补入这篇博客。
统一接口响应体的格式规范
比如,使用ResponseMessage<>类来作为返回给调用接口的用户的统一信息体,代码如后所示return new ResponseMessage<>(ResponseMessageCodeEnum.ERROR, "检查文件信息时发生异常");
。
- 通过修改响应体ResponseMessage<>的构造方法,使
ResponseMessage<>
只接受使用枚举类型来设置响应码的方式 - 在
ResponseMessage<>
中返回给用户的响应码,通过使用枚举类型,来保证同一情况对应统一的响应码,如下图所示。
检查调用接口人员的权限
TSInterfaceServiceI interfaceService = ApplicationContextUtil.getContext().getBean(TSInterfaceServiceI.class);
InterfaceRuleDto interfaceRuleDto = interfaceService.getInterfaceRuleByUserNameAndCode(“操作人员名称”,InterfaceEnum.注册的方法名);
if(interfaceRuleDto==null){
return Result.error("您没有该接口的权限!");
}
接口加密
接口还可以使用JDK中配置的加密算法?这篇博客中提到“ jdk\jre\lib\security\java.security 配置加密算法 ”,待确认
接口测试接口开发完毕后,就需要调用接口来测试功能。
方法一:直接在接口的服务器工程中新建一客户端
直接在服务器的工程中新建一个.class文件,在其中加入主函数,然后在主函数中接口。先运行【提供接口服务的】服务器端,再运行【测试接口的】客户端。
一个工程中可以有多个主函数,只不过当你运行属于服务器工程的代码文件时,会启动服务器的主函数,进而进入工程来运行你原本要运行的代码文件;而当你运行属于客户端工程的代码文件时,则会启动客户端的主函数。
控制台窗口
通过下图红框中的按钮“Display selected console”,可以切换显示客户端和服务器的控制窗口,以此来查看各自的运行日志和错误报告。
返回的信息
错误信息
注意JwtHttpUtil.httpRequest中的用于输出流的方法,如果Stream是错误信息,需要用httpUrlConn.getErrorStream();
来进行输出,如果仍用httpUrlConn.getInputStream();
就会报错。所以代码应如下所示,详见这篇博客。
if (httpUrlConn.getResponseCode()!=HttpURLConnection.HTTP_OK|) {
inputStream = httpUrlConn.getErrorStream();
}else {
inputStream = httpUrlConn.getInputStream();
}
返回的错误信息是html格式的,可以先放入记事本中,存为.html文件,再用浏览器打开,如下所示。
首先遇到的是connect timed out
,发现是自己在redis.properties中配置的服务器地址不对。
根据错误,修改了eclipse工程中的redis.properties中的redis.host的值,将其改为本机地址127.0.0.1
。保存,重启。
随后又遇到了Connection refused: connect
,如下所示。开始以为是没有装redis的原因,所以又赶紧将redis配置安装上了,详细的步骤可以参见这篇博客。
但是安装之后,依然有此问题,仍然提示Connection refused: connect
,并未得到解决。
在网上查找原因,发现是因为8080端口被占用了,命令提示行中输入netstat -aon|findstr 8080
,先根据端口号查找到进程号,如下图所示。注意,红框中的数字是占用8080端口的进程号,但并不是全部都占用的本地的8080端口!:
接着输入tasklist|findstr "7636"
,根据进程号查找进程名,发现是eclipse,如下所示。
最后,如果要关闭该进程,则根据进程名,输入taskkill /f /t /im eclipse.exe
。随后,出现了“X-AUTH-TOKEN header”提示,如下所示。离成功越来越近了。
还修改了redis的配置文件信息,在redis的安装目录中,
成功获取token
但是请注意,在安装配置好redis之后,第一次并未成功获取token,随后重新启动redis,再次调用token接口,才获取到接口。
已确认,在请求接口前需要先启动redis(先
F:
进入redis的安装盘符,再
cd Redis-5.0.10
进入redis的安装目录,最后执行启动指令
redis-server.exe redis.windows.conf
,如上图红框所示),否则会出现如下的错误提示。
同一工程中开发前端和后端,用前端来调用后端进行测试
详见此博客。
方法二
自己使用的是swagger来测试接口,详细的安装配置和使用方法可以参考这篇博客。
方法三
可以尝试这篇博客中提供的测试接口的方法。