zoukankan      html  css  js  c++  java
  • 面试题(restful)

    面试题(restful)

     
     
    1. 谈谈你对restful 规范的理解?
                - restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。
                - 最显著的特点:
                    restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。
                    no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/
                - 当然,还有协议其他的,比如:
                    - 版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数
                    - 状态码,200/300/400/500
                    - url中尽量使用名词,restful也可以称为“面向资源编程”
                    - api标示:
                        api.luffycity.com
                        www.luffycity.com/api/
                ...
                .....
            2. 你的restful是怎么学的?
                - 因为之前公司要写这样项目
                    - 接口
                    - 公司要做前后端分离的项目
                    - 公司要做微信小程序的开发
                - 所以就开始学习restful规范,看的技术文章 阮一峰的博客学到的规范。
                
            3. 状态码都有哪些?
            
            4. method都有哪些?
            
            5. 常见请求头有哪些?
            
            6. 你是用什么开发的restful接口?
                使用django rest framework框架。
                
            7. 为什么要使用django rest framework框架?
                在编写接口时可以不适用django rest framework框架,
                
                如果不使用:也可以做,那么就可以django的CBV来实现,开发者编写的代码会更多一些。
                如果  使用:内部帮助我们提供了很多方便的组件,我们通过配置就可以完成相应操作,如:
                            - 序列化,可以做用户请求数据校验+queryset对象的序列化称为json
                            - 解析器,获取用户请求数据request.data,会自动根据content-type请求头的不能对数据进行解析
                            - 分页,将从数据库获取到的数据在页面进行分页显示。
                            还有其他:
                                - 认证
                                - 权限
                                - 访问频率控制
                                - ... 
                    
            8. rest framework 视图你都用过哪些基类?
                
                a. 继承 APIView
                    这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。
                    
                
                
                   class GenericAPIView(APIView)
                        
                        def post(...):
                            pass 
                        
                        
                        
                b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
                    如果继承它之后,路由中的as_view需要填写对应关系    .as_view({'get':'list','post':'create'})
                    在内部也帮助我们提供了一些方便的方法:
                        - get_queryset
                        - get_object
                        - get_serializer
                    
                    注意:要设置queryset字段,否则会跑出断言的异常。
                    # 只提供增加功能
                    class TestView(GenericViewSet):
                        serializer_class = XXXXXXX
    
                        def create(self,*args,**kwargs):
                            pass # 获取数据并对数据进行操作
            
                    
                c. 继承 
                        - ModelViewSet
                        - mixins.CreateModelMixin,GenericViewSet
                        - mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
                
                    对数据库和分页等操作不用我们在编写,只需要继承相关类即可。
                    
                    示例:只提供增加功能
                    class TestView(mixins.CreateModelMixin,GenericViewSet):
                        serializer_class = XXXXXXX
            
            
                类的继承关系
            
            
            9. 认证流程?
                - 如何编写?写类并实现authticate
                - 方法中可以定义三种返回值:
                    - (user,auth),认证成功
                    - None , 匿名用户
                    - 异常 ,认证失败
                - 流程:
                    - dispatch 
                    - 再去request中进行认证处理
                
            10. 访问频率控制 
                - 匿名用户,根据用户IP或代理IP作为标识进行记录,为每一个用户在redis中创建一个列表
                    {
                        throttle_1.1.1.1:[1526868876.497521,152686885.497521...]
                        throttle_1.1.1.2:[1526868876.497521,152686885.497521...]
                        throttle_1.1.1.3:[1526868876.497521,152686885.497521...]
                        throttle_1.1.1.4:[1526868876.497521,152686885.497521...]
                        throttle_1.1.1.5:[1526868876.497521,152686885.497521...]
                    }
                    
                    每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。
                    
                    如何封IP:在防火墙中进行设置
                - 注册用户,根据用户名或邮箱进行判断。
                    {
                        throttle_xxxx1:[1526868876.497521,152686885.497521...]
                        throttle_xxxx2:[1526868876.497521,152686885.497521...]
                        throttle_xxxx3:[1526868876.497521,152686885.497521...]
                        throttle_xxxx4:[1526868876.497521,152686885.497521...]
                    
                    }
                    
                    每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。
            
                1分钟:40次
    
    
          
               11. 接口的幂等性?(是否会造成2次伤害)
               一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等性。
               比如:
                GET, 第一次获取结果、第二次也是获取结果对资源都不会造成影响,幂等。
                POST,第一次新增数据,第二次也会再次新增,非幂等。
                PUT, 第一次更新数据,第二次不会再次更新,幂等。
                PATCH,第一次更新数据,第二次不会再次更新,非幂等。
                DELTE,第一次删除数据,第二次不在再删除,幂等。
        
        
               12. Https和Http区别?
                端口:
                http:80
                https: 443 
                流程:
                - 自定义证书
                - 认证机构
  • 相关阅读:
    Matlab .asv是什么文件
    matlab中常数下的点是什么意思
    Matlab 根号的输入
    Paired t-test
    气血
    getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()
    ViewPager实现滑动翻页效果
    ViewPager结合Fragment进行无限滑动
    ViewPager结合view无限滑动
    Android的ToolBar
  • 原文地址:https://www.cnblogs.com/xyhh/p/10861055.html
Copyright © 2011-2022 走看看