# QWebService
**Repository Path**: chinesetiger/QWebService
## Basic Information
- **Project Name**: QWebService
- **Description**: 一个基于Spring框架快速发布基于WEB的远程访问的工具库, 目标是让开发WEB服务接口变得简单. 一次发布, 多种方式调用;支持HTTP方式调用;支持Hessian和QWeb方式RPC调用;支持JSONP跨域方式返回;支持简单生成接口文档。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2015-04-16
- **Last Updated**: 2024-11-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# QWebService - Quickly Web Service
QWebService 是一个基于Spring框架快速发布QWeb Service的RPC远程访问的工具库, 目标是让开发开放WEB服务接口变得简单.
## 启用方法
### pom.xml
```xml
cn.duapi.qweb
qwebservice
2.0-SNAPSHOT
```
### Spring boot @EnableQWebService
在SpringBoot项目中, 可以直接用`@EnableQWebService`开启`QWebService`注解支持
或者, 可以在项目的`applicationContext.xml`引入注解支持的注册器
```html
```
### 在代码中使用`@QWebService`注解来标注QWebService
下面的方法前提是**需要让Spring框架扫描到你的这个类**自动装配Bean, `@QWebService`本质也是一个`@Component`, 所以你可以在项目的任何地方采用
依赖注入的方式调用这个类.
### 发布服务模式一: 注解模式
`@QWebService`参数说明:
- `url`
指定要发布RPC-URL路径
- `api` 指定要发布的接口`url=`来表明映射的路径
- `value`指定beanName(@Compoment)
- `doc` 是否打开简单文档
- `accessToken` 是否启动token校验, 客户端请求需要带上accessToken
2.0版本砍掉了类发布支持, 接口模式更规范, 而且对于RPC场景, 都是需要先定义接口
```java
// value = 发布的URL映射地址
// api = 指定发布的接口方法为MyService
// value = 指定beanName
@QWebService(url = "/rpc/mytest/", api = MyService.class)
public class MyTestAPI implements MyService, OtherInterface{
// MyService 中定义了一个方法, 这个只会发布这个方法
@Override // from MyService
public boolean test() {
return false;
}
@Override // from OtherInterface
public MyModel get(int id) {
return new MyModel();
}
}
```
### 发布服务模式二: XML配置方式发布RPC
如果想了解注册过程可以采用XML配置, 整个配置类似Hessian发布RPC一样
```html
com.mytest.api.ResourceWebService
resourceExporter
```
## 客户端访问模式
### 1. QWeb客户端RPC访问
- 模式1: 直接创建代理RPC对象
```java
ResourceWebService proxy = QWebProxyFactoryBean.getProxy("http://localhost:8080/rpc/mytest", ResourceWebService.class,
"accessKey");
// 像本地调用一样使用
proxy.test("hello");
```
- 模式2: XML配置生成Bean
```xml
http://youdomain.com/rpc/mytest/
com.mytest.api.ResourceWebService
```
- 模式3: Spring Boot创建唯一Bean
```java
@Bean
public TestWebService testWebService() {
return QWebProxyFactoryBean.getProxy("http://localhost:8080/rpc/test", TestWebService.class,
"accesskey");
}
```
- 模式4: @QWebClient客户端
在定义接口的时候. 直接定义客户端, 这在制作SDK给别人用的时候, 其他人不需要关心如何创建代理
使用`@WebClient`客户端需要开启注解扫描和自动代理 `@EnableQWebClients` 指定要扫描`@QWebClient`注解的包
```java
@QWebClient(baseUrl = "${qweb.client.base-url}", path = FirstGuideService.DIR, accessToken = "${qweb.client.access-token:}")
public interface FirstGuideService {
String DIR = "/rpc/firstGuide";
/**
* test
*
* @param model
* @param name
* @param version
* @return
*/
FirstGuideModel find(FirstGuideModel model, String name, Integer version);
}
```
开启QWebClient注解扫描
```java
@SpringBootApplication(scanBasePackages = "com.example.demo")
@EnableQWebClients("com.mamu.server.api") // 指定扫描的包
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
### 2. 浏览器客户端访问
直接把接口当成是一个HTTP接口, 用 `[方法名].do` 的方式调用接口, 并按照URL参数协议传递参数即可
比如`list.do`
##### 直接调用
> http://youdomain.com/rpc/mytest/list.do?pageId=1
##### 跨域访问,支持JSONP, 只需要传递callback
> http://youdomain.com/rpc/mytest/list.do?pageId=1&callback=cb
##### 跨域访问,支持返回JS, 只需要传递val
> http://youdomain.com/rpc/mytest/list.do?pageId=1&val=d
### 自定义返回结果格式
如果你不想返回默认的`JsonView`, 那么你还可以自定义返回格式, QWebService提供了一些自定义的功能.
但这样做的后果是当前的`QWebService`只能基于Controller访问, 不能使用QWebService的Java客户端采用RPC方式连接上,比如Hessian等, 因为这破坏了统一的返回格式, 所以自定义的方式是不建议的.
如果你想返回一个其他的`ModelAndView`最好还是自己写对应的Controller, 因为快速发布可用的HTTP访问接口才是QWebService的初衷.
+ 直接在返回方法返回一个`ModelAndView`结果
+ 实现总的`QWebViewHandler` 接口
### 方法中直接返回ModelAndView对象, 覆盖默认的JsonView
```java
@QWebService(url="/rpc/mytest/")
public class MyTestAPI implements QWebViewHandler {
public boolean test() {
return false;
}
//在方法体中直接返回一个ModelAndView, 就像Controller一样, 会优先使用方法体的ModelAndView
public ModelAndView get() {
return new PagingJsonView(1, 10);
}
}
```
### 当前类实现`QWebViewHandler`接口
如果需要统一当前发布`QWebService`的所有公有方法体
```java
@QWebService(url = "/rpc/mytest/")
public class MyTestAPI implements QWebViewHandler {
public boolean test() {
return false;
}
//方法体中的ModelAndView比QWebViewHandler优先级更高
public ModelAndView get() {
return new PagingJsonView(1, 10);
}
@Override
public ModelAndView getResultView(String currMethodName, Object result) {
// TODO 统一实现你处理方法, 这个公开的QWebService会统一使用这个渲染
return null;
}
@Override
public ModelAndView getExceptionView(String currMethodName, Throwable ex) {
// TODO 统一实现如果抛出异常后的错误的处理方法
return null;
}
}
```
## 简单文档接口
`QWebService` 在1.2版本以后可以为每个开放的接口生成一个简单`markpage`文档(自主), 为开放的接口生成一个HTML文档描述
启用方式: 在注解`@QWebService`的`doc`接口添加一些描述使得内容非空, 默认会启用文档功能.
如果不想启用, 不配置`doc`就行
启用文档后, 浏览器直接访问 `url`接口时会看见一个接口文档, 调用方法和参数类型一览无遗.
生成的`markpage`文档省去你自己写接口文档的麻烦(尤其是接口多,参数多的时候), 你可以另存为HTML文件, 然后为了隐蔽而关闭`doc`, 稍作修改, 就可以发给调用方了
## 关于
Author: Qin Wei
email: imqinwei@qq.com
### License
[The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)