Web API

注册中心可以在 config.json 定义主机网络API位置,以支持下面列出的任何动作。

对于需要认证的请求,Cargo包含 Authorization 头。该头的值是API token "令牌"。如果令牌无效,服务器应以403代码进行响应。用户应该访问注册中心的网站来获得令牌 ,Cargo可以使用 cargo login 命令来存储令牌,或者在命令行中传递令牌。

响应使用代码200表示成功。 错误应使用适当的响应代码,如404。 失败响应应该有一个JSON对象,其结构如下:

{
    // 要显示给用户的错误数组。
    "errors": [
        {
            // 作为字符串的错误消息。
            "detail": "error message text"
        }
    ]
}

如果响应中有这种结构,Cargo会向用户显示详细信息,即使响应代码是200。 如果响应代码表示有错误,而且内容中没有这种结构,Cargo会向用户显示一条旨在帮助调试服务器错误的信息。 服务器返回一个 errors 对象,允许注册中心提供更详细的或以用户为中心的错误信息。

为了向后兼容,服务器应该忽略任何意外的查询参数或JSON字段。 如果缺少的JSON字段,应该假定它为空。终端使用路径的 v1 部分进行版本控制,如果将来有需要,Cargo负责处理向后兼容的回调。

Cargo为所有请求设置了以下头信息:

  • Content-Type: application/json
  • Accept: application/json
  • User-Agent: The Cargo version such as cargo 1.32.0 (8610973aa 2019-01-02). This may be modified by the user in a configuration value. Added in 1.29.

发布

  • Endpoint: /api/v1/crates/new
  • Method: PUT
  • Authorization: Included

发布终端用于发布新版本的crate。服务器应该验证该crate,使其可供下载,并将其添加到索引中。

Cargo发送的数据体:

  • JSON数据长度的32位无符号小端整数。
  • 作为JSON对象的包的元数据。
  • .crate 文件长度的32位无符号小端整数。
  • .crate 文件。

下面是JSON对象注释的例子。包括一些由crates.io所限制的说明, 只是为了说明一些关于可能进行的验证类型的建议,而不是crates.io所限制的详尽清单。

{
    // 包的名称。
    "name": "foo",
    // 发布的包的版本。
    "vers": "0.1.0",
    // 包直接依赖的数组。
    "deps": [
        {
            // 依赖的名称。
            // 如果依赖是由源包名重新命名的,这就是原来的名字。新的包名被保存在 `explicit_name_in_toml` 字段中。
            "name": "rand",
            // 这个依赖的语义化版本要求。
            "version_req": "^0.6",
            // 为该依赖启用的特性数组(以字符串形式)。
            "features": ["i128_support"],
            // 布尔值,表示这是否是可选的依赖。
            "optional": false,
            // 是否启用默认特性的布尔值。
            "default_features": true,
            // 依赖的目标平台。
            // 如果不是目标依赖,则为空。
            // 否则,就是字符串,如 "cfg(windows)" 。
            "target": null,
            // 依赖的类别。
            // "dev", "build", or "normal".
            "kind": "normal",
            // 该依赖所在的注册中心索引的URL,是字符串。如果没有指定或为空,则假定该依赖在当前注册中心中。
            "registry": null,
            // 如果依赖被重新命名,这是新包名称的字符串。如果没有指定或为空,则该依赖未重命名。
            "explicit_name_in_toml": null,
        }
    ],
    // 为该包定义的一组特性。
    // 每个特性都映射到它所启用的特性或依赖数组。
    // Cargo对特性名称不做限制,但crates.io需要字母数字的ASCII、 `_` 或 `-` 字符。
    "features": {
        "extras": ["rand/simd_support"]
    },
    // 作者的字符串列表.
    // 可能为空。
    "authors": ["Alice <a@example.com>"],
    // 来自配置清单的描述字段。
    // 可能为空。crates.io 至少需要一些内容。
    "description": null,
    // 这个包的文档的网站的URL字符串。
    // 可为空。
    "documentation": null,
    // 这个包的主页的网站的URL字符串。
    // 可为空。
    "homepage": null,
    // README文件内容的字符串。
    // 可为空。
    "readme": null,
    // crate中的README文件的相对路径字符串。
    // 可为空。
    "readme_file": null,
    // 包的关键词的字符串数组。
    "keywords": [],
    // 包的类别字符串的数组。
    "categories": [],
    // 包的许可证的字符串。
    // 可为空。 crates.io 要求设置 `license` 或 `license_file` 。
    "license": null,
    // 许可证文件的相对路径字符串。
    // 可为空。
    "license_file": null,
    // 包的源码库网站的URL字符串。
    // 可为空。
    "repository": null,
    // 可选的 "状态" 标志的对象。每个值是字符串到字符串映射的对象。
    // crates.io对标志的格式有特殊解释。
    "badges": {
        "travis-ci": {
            "branch": "master",
            "repository": "rust-lang/cargo"
        }
    },
    // 包清单中的 `links` 字符串值,如果没有指定则为空。这个字段是可选的,默认为空。
    "links": null
}

响应成功包括JSON对象:

{
    // 可选的警告对象,以显示给用户。
    "warnings": {
        // 无效和被忽略的类别的字符串数组。
        "invalid_categories": [],
        // 标志名称的字符串数组,这些标志名称是无效的并被忽略。
        "invalid_badges": [],
        // 向用户显示的任意警告字符串的数组。
        "other": []
    }
}

Yank

  • Endpoint: /api/v1/crates/{crate_name}/{version}/yank
  • Method: DELETE
  • Authorization: Included

yank终端在索引中将给定版本的crate的 yank 字段设置为 true

响应成功包括JSON对象:

{
    // 表示删除成功,始终为true。
    "ok": true,
}

Unyank

  • Endpoint: /api/v1/crates/{crate_name}/{version}/unyank
  • Method: PUT
  • Authorization: Included

unyank终端在索引中将给定版本的crate的 yank 字段设置为 false

响应成功包括JSON对象:

{
    // 表示删除成功,始终为true。
    "ok": true,
}

所有者

Cargo没有固有的用户和所有者的概念,但它提供 owner 命令来帮助管理谁有控制crate的授权。 具体如何处理用户和所有者,由注册中心决定。 关于crates.io如何通过GitHub用户和团队处理所有者的描述,请参见[发布文档]。

Owners: List

  • Endpoint: /api/v1/crates/{crate_name}/owners
  • Method: GET
  • Authorization: Included

owners终端返回crate的所有者列表。

响应成功包括JSON对象:

{
    // crate的所有者数组。
    "users": [
        {
            // 所有者的唯一无符号32位整数。
            "id": 70,
            // 所有者唯一的用户名。
            "login": "github:rust-lang:core",
            // 所有者的名字。
            // 这是可选的,可以为空。
            "name": "Core",
        }
    ]
}

Owners: Add

  • Endpoint: /api/v1/crates/{crate_name}/owners
  • Method: PUT
  • Authorization: Included

PUT请求将向注册中心发送请求,以将新的所有者添加到crate里。 如何处理这个请求是由注册中心决定。 例如,crates.io会向用户发送一个邀请,他们必须在被添加之前接受。

该请求应包括以下JSON对象:

{
    // 要添加的所有者的 `login` 字符串数组。
    "users": ["login_name"]
}

响应成功包括JSON对象:

{
    // 表示添加成功,始终为真。
    "ok": true,
    // 一个要显示给用户的字符串。
    "msg": "user ehuss has been invited to be an owner of crate cargo"
}

Owners: Remove

  • Endpoint: /api/v1/crates/{crate_name}/owners
  • Method: DELETE
  • Authorization: Included

DELETE请求将从crate中删除一个所有者。该请求应包括以下JSON对象:

{
    // 要删除的所有者的 `login` 字符串数组。
    "users": ["login_name"]
}

响应成功包括JSON对象:

{
    // 表示删除成功,始终为真。
    "ok": true
}
  • Endpoint: /api/v1/crates
  • Method: GET
  • Query Parameters:
    • q: The search query string.
    • per_page: Number of results, default 10, max 100.

搜索请求将使用服务器上定义的标准对caate进行搜索。

响应成功包括JSON对象:

{
    // 结果数组
    "crates": [
        {
            // crate的名字。
            "name": "rand",
            // 可用的最高版本
            "max_version": "0.6.1",
            // crate的文字描述。
            "description": "Random number generators and other randomness functionality.\n",
        }
    ],
    "meta": {
        // 服务器上可用的结果总数。
        "total": 119
    }
}

Login

  • Endpoint: /me

"login" 终端不是实际的API请求。 它的存在仅仅是为了 cargo login 命令显示URL,指示用户在网络浏览器中访问以登录并获取API令牌。