restful-api最佳实践

简介:

Best-practices-for-a-pragmatic-restful-api

先阅读文档:http://www.oschina.net/translate/best-practices-for-a-pragmatic-restful-api 理解restful api设计理念

我们公司的所有微服务接口都放在 "api.998jk.com/微服务名" 下

微服务内部api设计规范为:业务域/访问级别, 与best-practices-for-a-pragmatic-restful-api的区别是加入了一级访问级别,例如:

简单列表接口 /chatMessage/pb GET方式,提交参数page,pageSize,total

复杂查询接口 /chatMessage/pb/search POST方式,提交参数为json RequestBody,根据各个接口不同自行定义

查询单条接口 /chatMessage/pb/123 GET方式,123为id

删除单条接口 /chatMessage/pt/123 DELETE方式,123为id

更新单条接口 /chatMessage/pt/123 PUT方式,提交参数为json RequestBody,根据各个接口不同自行定义

上述示例 完整路径为:api.998jk.com/微服务名/chatMessage/xxx

访问级别:

    pb(public) 公开,对外对内没有任何限制;

    pt(protected) 受保护,对外受保护,对内没有任何限制。需要header中含有authorization 值为"Bearer token令牌"。在api gateway会获取该token, 并且在header中设置uid 值为该令牌的用户id。

    df(default) 默认,对外加密,对内没有任何限制。继承protected限制。并且在api gateway会对返回结果加密,客户端需要对结果解密后使用。加密后json如下:

{"encrypted":"返回结果加密后的字符串"}

    pv(private) 私有的,对外无法访问,对内没有任何限制。继承default限制。

 

暴露的restful服务需采用JAX-RS标准注解,无需springMVC controller 直接暴露service,需要使用swagger注解以便自动产生restful api文档。示例如下

package charles.sc.provider.service;

import charles.sc.provider.entity.ChatMessage;
import com.jztey.framework.mvc.Paging;
import com.jztey.framework.mvc.RestfulPagingResult;
import com.jztey.framework.mvc.RestfulResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;

import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

/**
 * Created by Charles on 2016/8/15.
 */
@FeignClient(value = "provider-service")
@Path("/chatMessage")
@Produces(MediaType.APPLICATION_JSON)
@Api(tags = {"聊天消息接口"})
public interface ChatMessageService {
    @Path("/pb")
    @GET
    @ApiOperation(value = "聊天记录列表", response = RestfulPagingResultChatMessage.class)
    RestfulPagingResult<ChatMessage> findPage(@QueryParam("id") int page, @QueryParam("pageSize") int pageSize, @QueryParam("total") int total);

    @Path("/pt/{id:\\d+}")
    @GET
    @ApiOperation(value = "按id查询聊天记录", response = RestfulResultChatMessage.class)
    RestfulResult<ChatMessage> find(@PathParam("id") Long id);

    @Path("/pb/search")
    @POST
    @ApiOperation(value = "搜索聊天记录", response = RestfulPagingResultChatMessage.class)
    RestfulPagingResult<ChatMessage> search(Paging<ChatMessage> paging);

    @Path("/pt")
    @POST
    @ApiOperation(value = "添加聊天记录", response = RestfulResultChatMessage.class)
    RestfulResult<ChatMessage> insert(@HeaderParam("uid") Long uid, @ApiParam @Valid ChatMessage chatMessage);

    @Path("/pt/{id:\\d+}")
    @DELETE
    @ApiOperation(value = "按id删除聊天记录", response = RestfulResultChatMessage.class)
    RestfulResult<ChatMessage> delete(@HeaderParam("uid") Long uid, @PathParam("id") Long id);

    @Path("/pt/{id:\\d+}")
    @PUT
    @ApiOperation(value = "修改聊天记录", response = RestfulResultChatMessage.class)
    RestfulResult<ChatMessage> update(@HeaderParam("uid") Long uid, @PathParam("id") Long id, @ApiParam @Valid ChatMessage chatMessage);

    class RestfulResultChatMessage extends RestfulResult<ChatMessage> {
    }

    class RestfulPagingResultChatMessage extends RestfulPagingResult<ChatMessage> {
    }
}

 

package charles.sc.provider.service;

import charles.sc.provider.entity.ChatMessage;
import com.jztey.framework.mvc.Paging;
import com.jztey.framework.mvc.RestfulPagingResult;
import com.jztey.framework.mvc.RestfulResult;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Charles on 2016/8/16.
 */
@com.alibaba.dubbo.config.annotation.Service
@Service
public class ChatMessageServiceImpl extends BaseService<ChatMessage> implements ChatMessageService {

    @Override
    public RestfulPagingResult<ChatMessage> findPage(int page, int pageSize, int total) {
        System.out.println("get");
        // 统一使用查询接口
        Paging<ChatMessage> paging = new Paging<>(page, pageSize);
        paging.setTotal(total);

        return this.search(paging);
    }

    @Override
    public RestfulResult<ChatMessage> find(Long id) {
        System.out.println("getById");
        return new RestfulResult(new ChatMessage(id, "fu", "tu", "msg", "mi", System.currentTimeMillis(), System.currentTimeMillis(), ChatMessage.STATUS_NO_PROCESS));
    }

    @Override
    public RestfulPagingResult<ChatMessage> search(Paging<ChatMessage> paging) {
        System.out.println("search");
        List<ChatMessage> entityList = new ArrayList<>();

        entityList.add(new ChatMessage(1L, "fu", "tu", "msg", "mi", System.currentTimeMillis(), System.currentTimeMillis(), ChatMessage.STATUS_NO_PROCESS));
        entityList.add(new ChatMessage(2L, "fu2", "tu2", "msg2", "mi2", System.currentTimeMillis(), System.currentTimeMillis(), ChatMessage.STATUS_NO_PROCESS));

        if (-1 == paging.getTotal()) {    // total没有传上来
            // 查询total
            paging.setTotal(100);
        }
        return new RestfulPagingResult(entityList, paging.getTotal());
    }

    @Override
    public RestfulResult<ChatMessage> insert(Long uid, ChatMessage chatMessage) {
        System.out.println("insert uid:" + uid);
        return new RestfulResult<>(chatMessage);
    }

    @Override
    public RestfulResult<ChatMessage> delete(Long uid, Long id) {
        System.out.println("delete uid:" + uid);
        return new RestfulResult(new ChatMessage(id, "fu", "tu", "msg", "mi", System.currentTimeMillis(), System.currentTimeMillis(), ChatMessage.STATUS_NO_PROCESS));
    }

    @Override
    public RestfulResult<ChatMessage> update(Long uid, Long id, ChatMessage chatMessage) {
        System.out.println("update uid:" + uid);
        return new RestfulResult<>(chatMessage);
    }
}

完整代码参考:http://gitlab.998jk.com/heying/spring-cloud





      本文转自yushiwh 51CTO博客,原文链接:http://blog.51cto.com/yushiwh/1942254,如需转载请自行联系原作者



相关文章
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
25 0
|
4天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
7天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
20天前
|
XML JSON 安全
谈谈你对RESTful API设计的理解和实践。
RESTful API是基于HTTP协议的接口设计,通过URI标识资源,利用GET、POST、PUT、DELETE等方法操作资源。设计注重无状态、一致性、分层、错误处理、版本控制、文档、安全和测试,确保易用、可扩展和安全。例如,`/users/{id}`用于用户管理,使用JSON或XML交换数据,提升系统互操作性和可维护性。
14 4
|
22天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
25 3
|
29天前
|
缓存 前端开发 API
构建高效可扩展的RESTful API:后端开发的最佳实践
【2月更文挑战第30天】 在现代Web应用和服务端架构中,RESTful API已成为连接前端与后端、实现服务间通信的重要接口。本文将探讨构建一个高效且可扩展的RESTful API的关键步骤和最佳实践,包括设计原则、性能优化、安全性考虑以及错误处理机制。通过这些实践,开发者可以确保API的健壮性、易用性和未来的可维护性。
|
30天前
|
API 开发者 UED
深入探讨RESTful API设计原则及最佳实践
在当今互联网时代,RESTful API已成为各种软件系统之间进行通信的重要方式。本文将从资源定义、URI设计、HTTP方法选择、状态码规范等方面深入探讨RESTful API设计的原则与最佳实践,帮助开发者更好地构建高效、健壮的API。
|
1月前
|
JSON Java API
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
22 1
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务