odoo中接口开发-程序员宅基地

技术标签: 数据库  

文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627


案例0000001

接口调用请求说明:
https请求方式:GET(请使用https协议)
csrf=False
csrf(Cross-site request forgery跨站请求伪造)问题,get请求不影响,post就需要csrf认证
CSRF(跨站请求伪造)
CSRF 英文全称为 Cross SIte Request Forgery
CSRF 通常指恶意攻击者盗用用户的名义,发送恶意请求,严重泄露个人信息危害财产的安全


@http.route('/forum/get_url_title', type='json', auth="public", methods=['POST'], website=True)
def get_url_title(self, **kwargs):
try:
req = requests.get(kwargs.get('url'))
req.raise_for_status()
arch = lxml.html.fromstring(req.content)
return arch.find(".//title").text
except IOError:
return False


响应数据格式:json
响应数据例子:
{
"data":ODOO_DATA

"result":{

"other_field":[]

"state":TRUE
}
}


对方通过:
http://127.0.0.1:8069//forum/get_url_title 传送json数据过来:







二、情况2:发送数据给其他系统【执行函数】
1.调用其他系统做的服务接口:
案例0002:查询数据案例:
步骤1:做一个统一登陆的函数:a:用户名、b:密码、c:密钥【自动生成的密钥]
步骤2:传入查询条件参数:调用接口服务函数执行查询:【定义好服务端返回的数据格式json】
步骤3:将查询好的数据解析:存储在本系统中 re_data = json.dumps(test_data)




"""
#REST 与 SOAP 与 XML-RPC

具体介绍:


""" API接口开发总结:
什么是接口
接口无非就是客户端请求你的接口地址,并传入一堆该接口定义好的参数,通过接口自身的逻辑处理,返回接口约定好的数据以及相应的数据格式
接口怎么开发

接口由于本身的性质,由于和合作方对接数据,所以有以下几点需要在开发的时候注意:
定义接口入参:写好接口文档
定义接口返回数据类型:一般都需要封装成一定格式,确定返回json还是xml报文等


#一、情况1:接收从其他系统传过来的数据:一般用http 形式数据格式json格式的。

1. 使用GET、POST、PUT、DELETE这几种请求模式

请求模式也可以说是动作、数据传输方式,通常我们在web中的form有GET、POST两种,而在HTTP中,存在下发这几种。

GET (选择):从服务器上获取一个具体的资源或者一个资源列表。
POST (创建): 在服务器上创建一个新的资源。
PUT(更新):以整体的方式更新服务器上的一个资源。
PATCH (更新):只更新服务器上一个资源的一个属性。
DELETE(删除):删除服务器上的一个资源。
HEAD : 获取一个资源的元数据,如数据的哈希值或最后的更新时间。
OPTIONS:获取客户端能对资源做什么操作的信息。


常见的请求参数
比如在数据过多, 需要对数据进行分页请求的时候, 我们应该统一 API 请求参数. 常见的有这些.

limit=10 指定返回记录的数量
offset=10 指定返回记录的开始位置。
page=2&per_page=100 指定第几页,以及每页的记录数。
sortby=name&order=asc 指定返回结果按照哪个属性排序,以及排序顺序。
animal_type_id=1 指定筛选条件



3.json数据类型

接口的数据一般都采用JSON格式进行传输,不过,需要注意的是,JSON的值只有六种数据类型:

Number:整数或浮点数
String:字符串
Boolean:true 或 false
Array:数组包含在方括号[]中
Object:对象包含在大括号{}中
Null:空类型


4.返回的数据结构



服务器返回的数据结构,一般为:

{
code:0,
message: "S",
data: { key1: value1, key2: value2, ... }
}

code: 返回码,0表示成功,非0表示各种不同的错误
message: 描述信息,成功时为"success",错误时则是错误信息
data: 成功时返回的数据,类型为对象或数组

不同错误需要定义不同的返回码,属于客户端的错误和服务端的错误也要区分,比如1XX表示客户端的错误,2XX表示服务端的错误。这里举几个例子:

0:成功
100:请求错误
101:缺少appKey
102:缺少签名
103:缺少参数
200:服务器出错
201:服务不可用
202:服务器正在重启




5. 使用SSL(https)来提供URL
首先,使用https可以在数据包被抓取时多一层加密。我们现在的APP使用环境大部分都是在路由器WIFI环境下,一旦路由器被入侵,那么黑客可以非常容易的抓取到用户通过路由器传输的数据,如果使用http未经加密,那么黑客可以很轻松的获取用户的信息,甚至是账户信息。
其次,即使使用https,也要在API数据传输设计时,正确的采用加密。例如直接将token信息放在URL中的做法,即使你使用了https,黑客抓不到你具体传输的数据,但是可以抓到你请求的URL啊!(查了资料了,https用GET方式请求,也仅能抓到域名字符部分,不能抓到请求的数据,
但是URL可以在浏览器或特殊客户端工具中直接看到。多谢下面的朋友指正错误)因此,使用https进行请求时,要采用POST、PUT或者HEAD的方式传输必要的数据。



6.TOKEN

现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。实现上,大部分都采用token的认证方式,一般流程是:

用户用密码登录成功后,服务器返回token给客户端;
客户端将token保存在本地,发起后续的相关请求时,将token发回给服务器;
服务器检查token的有效性,有效则返回数据,若无效,分两种情况:
token错误,这时需要用户重新登录,获取正确的token
token过期,这时客户端需要再发起一次认证请求,获取新的token

然而,此种验证方式存在一个安全性问题:当登录接口被劫持时,黑客就获取到了用户密码和token,后续则可以对该用户做任何事情了。用户只有修改密码才能夺回控制权。

如何优化呢?第一种解决方案是采用HTTPS。HTTPS在HTTP的基础上添加了SSL安全协议,自动对数据进行了压缩加密,在一定程序可以防止监听、防止劫持、防止重发,安全性可以提高很多。不过,SSL也不是绝对安全的,也存在被劫持的可能。另外,服务器对HTTPS的配置相对有点复杂,还需要到CA申请证书,而且一般还是收费的。而且,HTTPS效率也比较低。一般,只有安全要求比较高的系统才会采用HTTPS,比如银行。而大部分对安全要求没那么高的App还是采用HTTP的方式。

我们目前的做法是给每个接口都添加签名。给客户端分配一个密钥,每次请求接口时,将密钥和所有参数组合成源串,根据签名算法生成签名值,发送请求时将签名一起发送给服务器验证。类似的实现可参考OAuth1.0的签名算法。这样,黑客不知道密钥,不知道签名算法,就算拦截到登录接口,后续请求也无法成功操作。不过,因为签名算法比较麻烦,而且容易出错,只适合对内的接口。如果你们的接口属于开放的API,则不太适合这种签名认证的方式了,建议还是使用OAuth2.0的认证机制。

我们也给每个端分配一个appKey,比如Android、iOS、微信三端,每个端分别分配一个appKey和一个密钥。没有传appKey的请求将报错,传错了appKey的请求也将报错。这样,安全性方面又加多了一层防御,同时也方便对不同端做一些不同的处理策略。

另外,现在越来越多App取消了密码登录,而采用手机号+短信验证码的登录方式,我在当前的项目中也采用了这种登录方式。这种登录方式有几种好处:

不需要注册,不需要修改密码,也不需要因为忘记密码而重置密码的操作了;
用户不再需要记住密码了,也不怕密码泄露的问题了;
相对于密码登录其安全性明显提高了。


7.用户设计

显式用户和隐式用户,我不知道这两个词用的是否确切。
显式用户指的是,APP程序中有用户系统,一个username、password正确的合法用户,称之为显式的用户,
通常显式用户都需要注册,登录以后能完成一些个人相关的操作。

隐式用户指的是,APP程序本身就没有用户系统,或者一个在没有登录的情况下,使用我们APP的用户。
在这种情况下,可以通过客户端生成的UDID来标识一个用户。

有了用户信息,我们就能够了解不同用户的使用习惯,而不仅仅是全体用户的一个整体的统计信息,
有了这些个体的信息之后,就可以做一些用户分群、个性化推荐之类的事情。

如果是SAAS版本,还需要区分不同商户的用户




8.良好的接口说明文档和测试程序

接口文档有时候是项目初期就定下来的,前后端开发人员按照接口规范开发,
有的是接口开发完成后写的。
接口文档要清晰、明了,包含多少个接口,每个接口的地址、参数、请求方式、数据交换格式、返回值等都要写清楚。

接口测试程序,有条件的话,也可以提供,方便前后端的调试。



如果是springMVC开发的话,可以用swagger,后端只要加几个注释发一个url给前端就可以了,轻松又高效。




9.接口统计功能

在做PC端网站的时候,我们都会给我们的网站加上个统计功能,要么自己写统计系统,要么使用第三方的比如GA、百度等。
移动端接口API则需要我们自己实现统计功能,
这时就需要我们尽可能多的收集客户端的信息,除了传统的IP、User-Agent之外,还应该收集一些移动相关的信息,
比如
手机操作系统,是android还是ios,都是什么版本,
用户使用的网络状况,是2G、3G、4G还是WIFI
客户端APP是什么版本信息。

这样,有助于我们更好的了解我们用户的使用


转载于:https://www.cnblogs.com/1314520xh/p/11261532.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30432007/article/details/102278121

智能推荐

一对一直播源码开发,疑难杂症排查— 播放杂音、噪音、回声问题_开发音频 播放 伴随嘶哑声-程序员宅基地

文章浏览阅读203次。今天要跟大家分享的是一对一直播源码开发,疑难杂症排查— 播放杂音、噪音、回声问题,相比于一对一直播源码开发中的视频而言,音频要敏感得多,视频画面有噪点、马赛克都还是可以勉强被接受,而声音一旦有任何瑕疵,人耳都会特别容易感觉到,而且难以忍受。一、问题现象常见的一对一直播源码开发中音频问题现象描述如下:电流音,爆音,滋滋声或者嘟嘟声声音断断续续,听不清楚回声,能听到自己说话的声音二、 问题排查1、参数配置问题在一对一直播源码开发中,音频是一个特别敏感的东西,涉及到许多参数配置,一_开发音频 播放 伴随嘶哑声

15张超详细的Python学习路线图,纯良心分享,零基础学习宝典-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏23次。这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以用此文作为一个参考。在这个信息爆炸的时代,以 “Python入门” 为关键字搜索出的结果成千上万。不少小白选手难免会东一榔头西一棒槌,最终看了很多文章,却仍没跨过新手那道门槛。结合自身的学习经验以及与很多自学者的沟通了解,我们整理出,供诸位尚未入门或刚入门不久的同学参考。..._python学习路线图

干货全拿走-用Excel构建股票量化交易模型_个人炒股模型-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏23次。ExcelVBA写的几个量化算法和模型_个人炒股模型

mysql导出数据库报错,navicat 导入导出数据库报错的解决-程序员宅基地

文章浏览阅读1.1k次。在使用navicat导入导出数据功能时,导出没问题,导入总是报错,还遇到了中文乱码。在网上查了很多资料,比如使用了navicat的数据传输功能,但仍然报错,弄了几个小时都没解决。最后换了种思路,我直接用mysql自带的命令行来尝试导入导出,结果一试就成功无任何报错、乱码!这里顺便贴出网上的教程:MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cdMySQL中到bin文件夹的目..._mysqldump导入navicat错误

java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lan_mysql中java.lang.classcastexception: java.math.bigi-程序员宅基地

文章浏览阅读4.7k次。换个jar包就好了_mysql中java.lang.classcastexception: java.math.biginteger cannot be cast to

【计算机网络】电脑无法搜索到蓝牙设备,但是手机可以搜索到蓝牙设备-程序员宅基地

文章浏览阅读100次。电脑无法搜索到蓝牙设备,但是手机可以搜索到蓝牙设备,我出现这个问题是电脑默认设置下只能搜索到常用的连接配件,而高级设置可以搜索到全部的蓝牙设备。设置方法 Win11系统,设置->蓝牙和其他设备->设备->设备设置->蓝牙设备设置->高级。

随便推点

STC89C52定时器中断详解_stc89c52 1ms定时器-程序员宅基地

文章浏览阅读904次,点赞22次,收藏15次。细节图解分析定时器0/1中断细节,T0和T1的使用,以及机器时序的计算........._stc89c52 1ms定时器

HttpServletRequest & HttpServletResponse 中 Body 的获取_response.getbody-程序员宅基地

文章浏览阅读1.7w次,点赞8次,收藏15次。获取 HttpServletRequest 中的请求体HttpServletRequest#getInputStream() 获取到请求的输入流,从该输入流中可以读取到请求体。不过这个流在被我们的代码 read 过后,之后的代码就会报错,因为流已经被我们读取过了 , 尝试使用 mark() , reset() 也是不行的,会抛出异常。可以通过将 HttpServletRequest 对..._response.getbody

基于stm32F103移植FreeROTS移植心得总结_freerots系统移植-程序员宅基地

文章浏览阅读352次。FreeRTOS移植 V10.4.31、 FreeRTOS时钟节拍采用SYSTICK,所以需要将SYSTICK功能初始化,详情请参考正点原子移植的STM32F103历程。2、 SYSTICK例程u32 reload; SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M reload*=1000000/conf_freerots系统移植

java实现医药网站_JavaWeb版医药管理系统[中英文版]-程序员宅基地

文章浏览阅读168次。【实例简介】数据库为GBK 请大家建立数据库时注意数据库配置 :hibernate.cfg.xml参数配置 :MessageResources_zh_CN.properties首页登录 :http://localhost:8080/MedicineManager/用户登录页面 可以切换中英文:测试了将近2个小时 基本跑的不错 但是貌似有乱码问题、大家试着解决吧【实例截图】【核心代码】edb8d3e..._医学医药管理网页代码

Typescript 之接口 interface(详解)_ts interface-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏11次。你可以把它理解为形状,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数组应该是什么样子的,一个类和继承类需要符合什么样的描述等等。需要注意的是类 Interface 只会检查实例的属性,静态属性是需要额外定义一个 Interface;接口就是用来定义一个类结构,定义一个类中应该包含哪些属性和方法,同时接口也可以当成类型声明去使用。混合类型的接口就是使用同一个 Interface 来描述函数或者对象的属性或方法。接口可以约束对象,函数,类的结构和类型,是一种代码协作必须遵守的契约。_ts interface

springcloud之admin的搭建使用_spring cloud admin-程序员宅基地

文章浏览阅读1.6k次。微服务的优点是服务模块化,高内聚,低耦合。随着服务数量的增多,服务的监控也变得异常困难。springcloud引入提供了admin组件,人性化UI管理界面可以对所有服务的运行状态进行监控,并提供告警等功能。一.springboot-admin简介显示健康状况显示详细信息,例如JVM和内存指标数据源指标缓存指标关注并下载日志文件查看jvm系统和环境属性查看Spring Boot配置..._spring cloud admin