接口开发

Posted 进击的菜鸟啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口开发相关的知识,希望对你有一定的参考价值。

 

import flask,os
server = flask.Flask(__name__) #把当前这个python文件做为一个服务

 

@server.route(\'/error\',methods=[\'get\']) #@server.route是装饰器,声明之后,下面就是一个接口,
def cmd(): #不声明的话那就是一个普通的函数
cmd = flask.request.values.get(\'cmd\') #接口的入参
res = os.popen(cmd)

 

return res.read()

 

server.run(host=\'0.0.0.0\',port=8999,debug=True) #设置debug=True则修改代码后,它会自动帮你重启服务
# 127.0.0.1 0.0.0.0的话就说明,只要是局域网内都可以访问你的接口

 

1、接口开发需要用到的模块是flask和json模块。

首先来开发一个简单的接口

import flask,json
server=flask.Flask(__name__) #就是把当前这个python文件,当做一个服务
def my_db(sql):
import pymysql
coon = pymysql.connect(
host=\'localhost\', user=\'root\', passwd=\'123456\',
port=3306, db=\'caladb\', charset=\'utf8\')
cur = coon.cursor() #建立游标
cur.execute(sql)#执行sql
if sql.strip()[:6].upper()==\'SELECT\':
res = cur.fetchall()
else:
coon.commit()
res = \'ok\'
cur.close()
coon.close()
return res

@server.route(\'/index\',methods=[\'get\']) #@server.route()是设置它的访问路径和具体方法,这是装饰器
def index():
res={"msg":\'这是我开发的第一个接口\',\'msg_code\':0} #结果设置为json的格式
return json.dumps(res,ensure_ascii=False) #返回的结果就是json.dumps来显示结果

server.run(port=9000, debug=True, host=\'0.0.0.0\')    # 启动服务, debug=True 改了代码后不用重启服务 最后在启动,否则之后的访问不到
# host 设置成 0.0.0.0 同一局域网的可以访问

上面的请求是get请求的,你输入http://127.0.0.1:9000/index ,就会返回
{"msg":\'这是我开发的第一个接口\',\'msg_code\':0} 的消息,还可以做post请求的接口

@server.route(\'/regist\', methods=[\'post\'])
def regist():
  username = flask.request.values.get(\'username\') # 接收用户的数据
  pwd = flask.request.values.get(\'passwd\') # 接收用户的数据
  if username and pwd:
    sql = \'select * from my_user where username="%s"\' % username
    print(sql)
    if my_db(sql):
      res = {\'msg\': \'用户已存在\', \'msg_code\': 2001}
    else:
      insert_sql = \'insert into my_user (username, passwd, is_admin) values ("%s", "%s", 0)\' % (username, pwd)
      my_db(insert_sql)
      res = {\'msg\': \'注册成功\', \'msg_code\': 0}
    else:
      res = {\'msg\': \'必填字段未填,请查看接口文档!\', \'msg_code\': 1001}    # 1001 必填字段未填
  return json.dumps(res,ensure_ascii=False)

注意的一点是: server.run() 一定要放在所有接口的最底下运行,否则,在server.run()以下再开发接口,是检测不到的,不会被运行起来的,然后,再来结合之前学习到的内容,开发一个看起来逼格高些的接口

准备的东西:IDE: pycharm

  模块:pymysql, redis等,看具体文件吧、

  创建一个目录,长相如下图


 

其中 bin 目录存放启动服务的python文件,config存放配置参数,如mysql, redis, data文件存放sql语句,创建表格或者类似的东西,

lib 目录存放开发使用到的函数,即工具,还有开发好的接口也放在这里

logs 目录存放日志文件

READ_ME就是一个文档,类似说明书的一个作用

首先要知道一个接口的需求是什么,自己造一个,比如我们要写一个接口实现如下功能

1、写注册接口:

        1、写一个注册接口,让它的密码存成密文的。

        2、数据存到redis或者mysql里面(开森就好),redis的key就用string类型

        3、dachongzi  7869d295e566295b51eec5d6bed67c14

        4、校验用户是否存在

        user:dachongzi

    2、登录接口

        登录成功之后,返回seesionid,用户登录时间

        sessionid

            用户名+当前的时间戳 md5,seesion失效时间是60分钟

        sessionid:dachognzi

            {"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}

        如果这个用户已经登录过了,那么就返回他的seesionid,登录时间

首先要有一个实现这个接口的思路

1. 先捋一下要用到的配置参数,都是常量,都放到一个python文件里,在这里,我们会用到mysql, redis

  把这些配置信息先写上

    在 config 文件夹创建一个 setting.py文件,代码如下

  配置参数根据自己的实际情况写上

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
MYSQL_INFO = {
    \'host\': \'127.0.0.1\',
    \'user\': \'jxz\',
    \'password\': \'123456\',
    \'db\': \'jxz\',
    \'port\': 3306,
    \'charset\': \'utf8\'
}   # MySQL 的配置参数

REDIS_INFO = {
    \'host\': \'127.0.0.1\',
    \'password\': \'HK139bc&*\',
    \'port\': 6379,
    \'db\': 14
}     # redis 配置参数

SERVER_PORT = 8999      # 服务端端口
复制代码

2. 然后开发接口时需要用到的函数,即工具

因为涉及到对密码加密,操作redis或mysql, 以及返回数据的数据格式要求,

所以要写一个对密码加密的函数,操作redis的函数,操作mysql的函数,在lib文件夹里创建一个tools的python文件,代码如下

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pymysql, redis, hashlib, time
from config.setting import MYSQL_INFO, REDIS_INFO
def my_db(sql):    # 传入sql语句,操作数据库
    conn = pymysql.connect( **MYSQL_INFO)
    cur = conn.cursor()
    cur.execute(sql)
    if sql.strip()[:6].upper() == \'SELECT\':
        res = cur.fetchall()    # 获取数据库的数据
    else:
        conn.commit()   # 除select语句外的其他语句
        res = \'OK\'
    cur.close()
    conn.close()
    return res

def op_redis(k, v=None, seconds=None):  # 操作redis,如果只传入key,则获取value,
    # 如果传入key, value,将key,value写入redis,如果三个参数都有,则写入redis,有时限
    r = redis.Redis( **REDIS_INFO)
    if v and seconds:
        r.setex(k, v, seconds)
        res = \'OK\'
    elif v :
        r.set(k, v)
        res = \'OK\'
    else:
        if r.get(k):
            res = r.get(k).decode()
        else:
            res = None
    return res

def my_md5(s, salt=None):   # 如果传入 salt,则加密原字符串加salt,不传入salt,则只加密原字符串
    md = hashlib.md5()
    if salt:
        md.update((s + salt).encode())
        res = md.hexdigest()
    else:
        md.update(s.encode())
        res = md.hexdigest()
    return res

def my_time():      # 返回时间,格式如 20180508151213 2018-5-8 15:12:13
    a = time.localtime()
    res = str(a.tm_year) + str(a.tm_mon).zfill(2) + str(a.tm_mday).zfill(2) + str(a.tm_hour).zfill(2) + str(
        a.tm_min).zfill(2) + str(a.tm_sec).zfill(2)
    return res
复制代码

然后开发注册和登陆接口,也在lib 里,创建一个interface的python文件,代码如下

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import flask, json
from lib.tools import my_md5, my_time, op_redis

server = flask.Flask(__name__)  # 把当前文件当作一个服务

@server.route(\'/reg\', methods=[\'post\'])
def reg():
    username = flask.request.values.get(\'username\') # 获取输入值
    pwd  = flask.request.values.get(\'password\')
    k = \'user:\' + username
    v = my_md5(pwd)
    # print(\'username..\', username)
    if username and pwd:
        if op_redis(k):
            res = {\'msg\': \'用户已存在\', \'msg_code\': 2001}
        else:
            op_redis(k, v)
            res = {\'msg\': \'注册成功!\', \'msg_code\': 0}
    else:
        res = {\'msg\': \'必填字段未填,请查看接口文档!\', \'msg_code\': 1001}
    return json.dumps(res, ensure_ascii=False)


@server.route(\'/login\', methods=[\'post\'])
def login():
    username = flask.request.values.get(\'username\') # 获取输入值
    pwd  = flask.request.values.get(\'password\')
    pwd1 = my_md5(pwd)
    k = \'user:\' + username
    v = {\'session_id\': my_md5(pwd + my_time()), \'login_time\': my_time()}
    print(\'username..\', username)
    if username and pwd:
        if op_redis(k) == pwd1:
            k = \'login:\' + username
            if op_redis(k):     # 如果 key 已存在,即已登陆状态
                res = op_redis(k).replace(\'登陆成功\', \'已登陆\')
            else:               # key 不存在,未登陆
                v[\'status\'] = \'登陆成功\'
                op_redis(k, v, 3600)
                res = op_redis(k)
        else:
            res = "{\'msg\': \'账号或密码错误!\', \'msg_code\': 3001}"

    else:
        res = "{\'msg\': \'必填字段未填,请查看接口文档!\', \'msg_code\': 1001}"
    return json.dumps(res, ensure_ascii=False)
复制代码

这样,大部分工作就算完成了,最后在bin目录创建一个start的python文件,用来启动服务,代码如下

复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from lib.interface import server
from config.setting import SERVER_PORT

server.run(
    host=\'0.0.0.0\',
    port= SERVER_PORT,
    debug=True
)
复制代码

以上,一个接口就算开发完了,可以看到,我们在文件里引用自己的python文件作为模块,这里需要在pycharm里设置一下,否则可能会报错,

设置步骤这样那样就完成了,如下图

 

 

 

以上是关于接口开发的主要内容,如果未能解决你的问题,请参考以下文章

java 代码片段

无法通过接口获取与片段通信的活动

将接口从片段传递到kotlin中的活动

Fragment的ListView项接口定义中的按钮?

PHP项目开发经验整理

VSCode插件开发全攻略代码片段设置自定义欢迎页