web框架

gql-ext的Python项目详细描述


GraphQL立面

graphqlfaccade是一个python应用程序中介,它在 在后端使用GraphQL和REST应用程序的前端应用程序 服务描述的面向声明样式。在

GraphQL门面允许

  • 使用GraphQL语言向REST服务发出请求
  • 使用批量加载(以规则为准)

向应用程序添加新的REST服务

要添加新服务,您需要执行以下几个步骤:

  1. graphql syntax中创建数据架构的描述
  2. 创建REST service description(支持yaml或json)
  3. {json(或yaml}描述)
  4. schema description添加到主配置文件
  5. 在应用程序设置中指定服务的基Url

休息服务说明

<service_name>: 
    <endpoint_name>:
        method: <METHOD>
        path: <PATH>

service_name:restapi服务的名称。
endpoint_name:您的REST端点的名称。
method:GET、POST、PATCH、PUT、DELETE(获取默认值)
path:到yor端点的路径

分解器

^{pr2}$

Parent_name.field_name:graphql模式中的字段名(例如Query.name
endpoint:此数据字段的rest端点为service_nameendpoint_name格式
loader:自定义解析程序的路径(不是必需字段)。使用python站点包语法
args:如果您想使用任何参数来请求REST,可以设置args字段。 param_name-变量的任意名称,param_value-任意值。 要使用父元素的属性,请使用parent.前缀,然后使用属性的名称。 例如post_is: parent.idbatch:使用batch loading。默认为False

模式描述

schemas:
  <schema_name>:
    url: <schema_url>
    resolvers: <path/to/your/resolvers/file>
    sdl:
      - <list/of/paths/to/sdl/directories>
      - <or/and/sdl/files>

rest:
  - <list/of/paths/to/your/rest/description/files>

schema_name:你的模式名
url:graphql端点的url(默认情况下等于架构名称)
resolvers:解析程序文件的路径(相对于基目录)
sdl:指向.graphql文件(模式描述)或包含.graphql文件的目录的路径列表
rest:rest定义文件的路径列表(相对于基目录)

REST应用程序连接示例

假设您有一个带有签名的REST服务: 输入:

{
    id: [0, 1, 2],
    q: "any search string"
}

输出:

{
  "pagination": {
    "total": 0,
    "offset": 0,
    "limit": 0
  },
  "result": [
    {
      "conditions": {},
      "calculator_id": 0,
      "version": 0,
      "created": "2019-08-29T09:09:23.048Z",
      "terms": [
        0
      ],
      "status": "archive",
      "updated": "2019-08-29T09:09:23.048Z",
      "amounts": [
        0
      ],
      "priority": 0,
      "title": "string",
      "meta": {},
      "id": 0
    }
  ]
}

要将api连接到GraphQL facade,请执行以下步骤:

预览

作为所有步骤的结果,我们得到了结构(我们将不使用的文件和目录被省略)

-app
    -graphql
        -calculator
            -sdl
                mutation.graphql
                query.graphql
            loaders.py
            resolvers.yaml
            rest.yaml
        ...
    init_facade.yaml
    ...
...

.graphql文件-数据模式的描述
loaders.py自定义解析器(如果需要)
resolvers.yaml解析程序说明
rest.yamlrestapi服务说明
init_facade.yaml描述架构的所有架构和文件路径

文件方案是有条件的,不是强制性的,但建议遵守文件位置和命名的这一规则

1。描述数据模式

数据模式描述数据类型和参数 我们的休息服务将有以下表格

app/graphql/计算器/sdl/查询.graphql
type Query {
    calculators(id: [Int], q: String): Calculators
    }

type Calculators{
    pagination: Pagination
    result: [Calculator]
    }

type Calculator {
    id: Int
    created: String
    updated: String
    calculator_id: Int
    status: String
    version: Int
    title: String
    amounts: [String]
    terms: [Int]
    meta: String
    priority: Int
    conditions: String
    }

type Pagination {
    total: Int
    limit: Int
    offset: Int
    }

2。休息服务说明

REST描述文件包含有关REST处理程序的路径的信息

对于我们的API:

应用程序/图形/计算器/rest.json文件
{
  "calculator": {
    "find_calculators": {
      "method": "GET",
      "path": "/api/v1/pdl_calculators/"
    }
}

3。描述解析器

解析程序文件解释如何接收架构字段 (使用哪一个REST处理程序,是使用锡槽加载还是smth其他)

应用程序/图形/计算器/解析器.json
{
  "Query.calculators": {
    "endpoint": "calculator.find_calculators"
  }
}

4。主配置文件

应用程序/初始化_立面.yaml

配置文件描述模式的文件位置

schemas:

  calculator:
    url: calculator
    resolvers: app/graphql/calculator/resolvers
    sdl:
      - app/graphql/calculator/sdl

rest:
  - app/graphql/calculator/rest

5。配置的基本url

重要的是不要忘记在应用程序设置中指定url 我们没有在yaml或json文件中指定baseurl来将baseurl作为环境变量传递

密钥必须与中的REST服务名称匹配休息.yaml文件

设置/配置.py
class Config:
...
    BASE_URLS = {
                 ...
                 'calculator': env.str('calculator_api', default='http:/calculator.prod.com')
                 ...
                }
...

批量装载

要使用批处理加载,必须遵循以下几个简单规则:

  • REST API终结点必须符合ept id参数列表
  • REST必须在result字段中返回记录列表(执行请求的条件),并将id字段发送到每一行
    例如:
{
  "pagination": {
    "total": 2,
    "limit": 10,
    "offset": 0
  },
  "result": [
    {
      "id": 1
    },
    {
      "id": 2
    }
  ],
  "success": true
}
  • 最后在字段解析程序描述中设置batch=True
Calculator.calculator:
    endpoint: /api/v1/calculator
    batch: True

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java希望直接扫描要上传到网页的文档   java JavaFX使对象可见,但不使用(忽略)点击   java LibGdx奇怪的纹理行为   java JavaFx ComboBox在第一次单击时未获得正确的值   api WebDav服务器库最好使用Java   java在Android中维护应用程序状态   java保存在Android中拖放RecyclerView后所做的更改我已经阅读了所有内容   无法读取项目中所需库tomcatembedwebsocket的java存档,或者该存档不是有效的ZIP文件   c#类在系统中有哪些关联?如何在UML中最好地表示它们?   java如何使用bazaar访问两台计算机上的同一文件夹   Java易失性与缓存一致性   java如何解决http11。校长:例外?   java liferaymavenplugin从maven Liferay 6.2.5(6.2 ga6)部署war   安卓的jar for java在哪里。木卫一。文件   java邻接矩阵中BFS的顺序是什么?   虚拟机如何从java启动linux虚拟机?   向DefaultListModel添加元素时java JList未更新   java JMSListener批注无法与REST服务一起使用   java DirectoryStream返回路径的顺序是什么?文件名,上次修改,文件大小?   java DropWizard Hibernate doc想说什么?