获取单个Pull Request¶
GET /api/v5/repos/{owner}/{repo}/pulls/{number}
该接口用于获取指定仓库中单个 Pull Request 的详细信息,包括标题、状态、审核人与测试人信息、标签、合并门禁状态、里程碑及合并结果等,帮助开发者了解某一具体合并请求的完整情况。
访问令牌支持说明¶
- AtomGit 用户访问令牌(AtomGit user access tokens)
是否允许匿名访问¶
此接口允许匿名访问
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
owner |
path | string | 是 | 仓库所属空间地址(组织或个人的地址path) |
repo |
path | string | 是 | 仓库路径(path) |
number |
path | integer | 是 | 第几个PR,即本仓库PR的序数 |
access_token |
query | string | 否 | 用户授权码(可选) |
响应参数¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
id |
integer | 是 | 否 | Pull Request 的 ID |
html_url |
string | 是 | 否 | Pull Request 的 HTML 地址 |
number |
integer | 是 | 否 | 序号 |
state |
string | 是 | 否 | 状态,枚举:open / closed / merged |
title |
string | 是 | 否 | 标题 |
url |
string | 是 | 否 | api url |
issue_url |
string | 是 | 否 | 关联的 issue api url |
body |
string | 是 | 否 | 描述 |
assignees_number |
integer | 是 | 否 | 审核人人数 |
assignees |
object[] | 是 | 否 | 审核人信息 |
testers |
object[] | 是 | 否 | 测试人信息 |
approval_reviewers |
object[] | 是 | 否 | 评审人信息 |
labels |
object[] | 是 | 否 | 标签信息 |
created_at |
string | 是 | 否 | 创建时间 |
updated_at |
string | 是 | 否 | 更新时间 |
closed_at |
string | 是 | 是 | 关闭时间,未关闭时为 null |
merged_at |
string | 是 | 是 | 合并时间,未合并时为 null |
draft |
boolean | 是 | 否 | 是否为草稿 |
can_merge_check |
boolean | 是 | 否 | 是否通过合并检查 |
prune_branch |
boolean | 是 | 否 | 合并后删除源分支 |
mergeable |
boolean | 是 | 否 | 是否无冲突 |
user |
object | 是 | 否 | 创建人信息 |
head |
object | 是 | 否 | 提交信息 |
base |
object | 是 | 否 | 目标分支信息 |
mergeable_state |
object | 是 | 否 | 门禁信息 |
milestone |
object | 是 | 否 | 里程碑信息 |
visibility_reason |
string | 否 | 是 | 可见性,public:公开可见,other:仅项目成员可见 |
merged_by |
object | 是 | 否 | 合并人 |
close_related_issue |
boolean | 否 | 是 | 合并时是否关闭关联的 issue |
squash_merge |
boolean | 是 | 否 | Squash 合并 |
assignees 对象数组(审核人信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
assignees[].id |
string | 是 | 否 | 用户 ID |
assignees[].login |
string | 是 | 否 | 登录名 |
assignees[].name |
string | 是 | 否 | 姓名 |
assignees[].avatar_url |
string | 是 | 否 | 头像地址 |
assignees[].html_url |
string | 是 | 否 | 主页地址 |
assignees[].assignee |
boolean | 是 | 否 | 是否为审核人 |
assignees[].code_owner |
boolean | 是 | 否 | 是否为代码所有者 |
assignees[].accept |
boolean | 是 | 否 | 是否接受 |
testers 对象数组(测试人信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
testers[].id |
string | 是 | 否 | 用户 ID |
testers[].login |
string | 是 | 否 | 登录名 |
testers[].name |
string | 是 | 否 | 姓名 |
testers[].html_url |
string | 是 | 否 | 主页地址 |
testers[].assignee |
boolean | 是 | 否 | 是否为测试人 |
testers[].code_owner |
boolean | 是 | 否 | 是否为代码所有者 |
testers[].accept |
boolean | 是 | 否 | 是否接受 |
approval_reviewers 对象数组(评审人信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
approval_reviewers[].id |
string | 是 | 否 | 用户 ID |
approval_reviewers[].login |
string | 是 | 否 | 登录名 |
approval_reviewers[].name |
string | 是 | 否 | 姓名 |
approval_reviewers[].html_url |
string | 是 | 否 | 主页地址 |
approval_reviewers[].assignee |
boolean | 是 | 否 | 是否为审核人 |
approval_reviewers[].code_owner |
boolean | 是 | 否 | 是否为代码所有者 |
approval_reviewers[].accept |
boolean | 是 | 否 | 是否接受 |
approval_reviewers[].avatar_url |
string | 否 | 是 | 头像地址 |
approval_reviewers[].accept_status |
string | 是 | 否 | 审批状态:true(已通过),reject(已拒绝),optional(待处理) |
labels 对象数组(标签信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
labels[].id |
integer | 是 | 否 | 标签 ID |
labels[].color |
string | 是 | 否 | 标签颜色 |
labels[].name |
string | 是 | 否 | 标签名称 |
labels[].repository_id |
integer | 是 | 否 | 所属仓库 ID |
labels[].created_at |
string | 是 | 否 | 创建时间 |
labels[].updated_at |
string | 是 | 否 | 更新时间 |
user 对象(创建人信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
user.id |
string | 是 | 否 | 用户 ID |
user.login |
string | 是 | 否 | 登录名 |
user.name |
string | 是 | 否 | 姓名 |
user.avatar_url |
string | 是 | 否 | 头像地址 |
user.html_url |
string | 是 | 否 | 主页地址 |
head 对象(提交信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
head.ref |
string | 是 | 否 | 分支路径 |
head.sha |
string | 是 | 否 | commit id |
head.label |
string | 是 | 否 | label |
head.repo |
object | 是 | 否 | 仓库信息 |
head.user |
object | 是 | 否 | 用户信息 |
head.repo 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
head.repo.path |
string | 是 | 否 | 仓库路径 |
head.repo.name |
string | 是 | 否 | 仓库名称 |
head.repo.namespace |
object | 是 | 否 | 命名空间信息 |
head.repo.full_name |
string | 是 | 否 | 完整名称 |
head.repo.html_url |
string | 是 | 否 | 仓库 HTML 地址 |
head.repo.namespace 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
head.repo.namespace.path |
string | 是 | 否 | 命名空间路径 |
head.user 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
head.user.id |
string | 是 | 否 | 用户 ID |
head.user.login |
string | 是 | 否 | 登录名 |
head.user.name |
string | 是 | 否 | 姓名 |
head.user.avatar_url |
string | 是 | 否 | 头像地址 |
head.user.html_url |
string | 是 | 否 | 主页地址 |
base 对象(目标分支信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
base.ref |
string | 是 | 否 | 分支路径 |
base.sha |
string | 是 | 否 | commit id |
base.label |
string | 是 | 否 | label |
base.repo |
object | 是 | 否 | 仓库信息 |
base.repo 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
base.repo.path |
string | 是 | 否 | 仓库路径 |
base.repo.name |
string | 是 | 否 | 仓库名称 |
base.repo.namespace |
object | 是 | 否 | 命名空间信息 |
base.repo.full_name |
string | 是 | 否 | 完整名称 |
base.repo.html_url |
string | 是 | 否 | 仓库 HTML 地址 |
base.repo.namespace 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
base.repo.namespace.path |
string | 是 | 否 | 命名空间路径 |
mergeable_state 对象(门禁信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
mergeable_state.merge_request_id |
integer | 是 | 否 | 合并请求 ID |
mergeable_state.state |
boolean | 是 | 否 | 状态 |
mergeable_state.status_without_user_auth |
boolean | 是 | 否 | 无用户授权的状态 |
mergeable_state.conflict_passed |
boolean | 是 | 否 | 冲突通过 |
mergeable_state.branch_missing_passed |
boolean | 是 | 否 | 分支缺失通过 |
mergeable_state.non_ff_passed |
boolean | 是 | 否 | 非快进通过 |
mergeable_state.mr_state_passed |
boolean | 是 | 否 | 合并请求状态通过 |
mergeable_state.merged_by_user_passed |
boolean | 是 | 否 | 用户合并通过 |
mergeable_state.work_in_progress_passed |
boolean | 是 | 否 | 工作进展通过 |
mergeable_state.resolve_discussion_passed |
boolean | 是 | 否 | 解决讨论通过 |
mergeable_state.ci_state_passed |
boolean | 是 | 否 | CI 状态通过 |
mergeable_state.merge_by_self_passed |
boolean | 是 | 否 | 自我合并通过 |
mergeable_state.can_force_merge |
boolean | 是 | 否 | 可以强制合并 |
mergeable_state.approval_reviewers_required_passed |
boolean | 是 | 否 | 代码评审是否通过 |
mergeable_state.approval_approvers_required_passed |
boolean | 是 | 否 | 代码审查是否通过 |
mergeable_state.approval_testers_required_passed |
boolean | 是 | 否 | 代码测试是否通过 |
mergeable_state.merge_request_switch |
object | 是 | 否 | 合并请求切换 |
mergeable_state.reason |
object | 是 | 否 | 原因(以实际返回为准) |
mergeable_state.check_tasks_num |
integer | 是 | 否 | 检查事项总数 |
mergeable_state.all_depend_merge_request_merged_passed |
boolean | 是 | 否 | 所有依赖合并请求已合并通过 |
mergeable_state.approval_approvers_result |
integer | 是 | 否 | 审批人结果 |
mergeable_state.approval_testers_result |
integer | 是 | 否 | 测试人结果 |
mergeable_state.merge_request_switch 对象¶
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
mergeable_state.merge_request_switch.review_mode |
string | 是 | 否 | 审查模式 |
mergeable_state.merge_request_switch.merge_method |
string | 是 | 否 | 合并方法 |
mergeable_state.merge_request_switch.only_allow_merge_if_all_discussions_are_resolved |
boolean | 是 | 否 | 只有在解决所有讨论后才允许合并 |
mergeable_state.merge_request_switch.disable_merge_by_self |
boolean | 是 | 否 | 禁止自我合并 |
mergeable_state.merge_request_switch.only_allow_merge_if_pipeline_succeeds |
boolean | 是 | 否 | 只有在管道成功后才允许合并 |
mergeable_state.merge_request_switch.disable_squash_merge |
boolean | 是 | 否 | 禁止压缩合并 |
mergeable_state.merge_request_switch.squash_merge_with_no_merge_commit |
boolean | 是 | 否 | 无合并提交的压缩合并 |
mergeable_state.merge_request_switch.approval_required_reviewers_count |
integer | 是 | 否 | 需要审批的审查者数量 |
mergeable_state.merge_request_switch.approval_required_reviewers_branch |
string | 是 | 否 | 需要审批的审查者分支 |
mergeable_state.merge_request_switch.add_notes_after_merged |
boolean | 是 | 否 | 合并后添加注释 |
mergeable_state.merge_request_switch.mark_auto_merged_mr_as_closed |
boolean | 是 | 否 | 将自动合并的 MR 标记为已关闭 |
mergeable_state.merge_request_switch.can_force_merge |
boolean | 是 | 否 | 可以强制合并 |
mergeable_state.merge_request_switch.can_reopen |
boolean | 是 | 否 | 可以重新开放 |
milestone 对象(里程碑信息)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
milestone.created_at |
string | 是 | 否 | 创建时间 |
milestone.description |
string | 是 | 否 | 描述 |
milestone.number |
integer | 是 | 否 | 里程碑序号 |
milestone.state |
string | 是 | 否 | 状态 |
milestone.title |
string | 是 | 否 | 标题 |
milestone.updated_at |
string | 是 | 否 | 更新时间 |
merged_by 对象(合并人)
| 字段 | 类型 | 必返 | 可为空 | 说明 |
|---|---|---|---|---|
merged_by.id |
string | 是 | 否 | 用户 ID |
merged_by.login |
string | 是 | 否 | 登录名 |
merged_by.name |
string | 是 | 否 | 姓名 |
merged_by.avatar_url |
string | 是 | 否 | 头像地址 |
merged_by.html_url |
string | 是 | 否 | 主页地址 |
失败响应¶
认证失败、参数错误或目标 Pull Request 不存在时,接口会返回相应的失败状态码。以下错误字段名以后端实际返回为准。
400 参数错误
401 未认证
404 未找到
HTTP 响应状态码¶
| 状态码 | 说明 |
|---|---|
200 |
成功(OK) |
304 |
未修改(Not modified) |
401 |
需要认证(Requires authentication) |
403 |
禁止访问(Forbidden) |
404 |
未找到(Not found) |
请求示例¶
参数说明¶
<owner>替换为仓库所属空间地址(企业、组织或个人的地址 path);<repo>替换为仓库路径(path);<number>替换为第几个 PR(本仓库 PR 的序数)。
此接口允许匿名访问,示例中未携带访问令牌;如需访问私有仓库资源,可追加 access_token 查询参数:?access_token=<token>(<token> 替换为你的 AtomGit 用户访问令牌)。
cURL¶
curl -X GET 'https://api.atomgit.com/api/v5/repos/<owner>/<repo>/pulls/<number>' \
-H 'Accept: application/json'
JavaScript¶
// 原生 fetch (Node.js 18+ / 浏览器)
const response = await fetch("https://api.atomgit.com/api/v5/repos/<owner>/<repo>/pulls/<number>", {
headers: {
"Accept": "application/json",
},
});
if (!response.ok) {
throw new Error(`请求失败: ${response.status}`);
}
const data = await response.json();
console.log(data);
Python¶
import requests
resp = requests.get(
"https://api.atomgit.com/api/v5/repos/<owner>/<repo>/pulls/<number>",
headers={
"Accept": "application/json",
},
timeout=10,
)
resp.raise_for_status()
print(resp.json())
响应示例¶
状态码: 200
{
"id": 111,
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1",
"number": 1,
"url": "https://api.atomgit.com/api/v5/repos/sytest/paopao/pulls/1",
"issue_url": "https://api.atomgit.com/api/v5/repos/sytest/paopao/pulls/1/issues",
"state": "open",
"title": "示例 Pull Request",
"body": "Description",
"assignees_number": 1,
"assignees": [
{
"id": 2,
"login": "test",
"name": "test_web",
"avatar_url": "https://api.atomgit.com/sytest/paopao/pull/1.png",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1",
"assignee": true,
"code_owner": false,
"accept": true
}
],
"testers": [
{
"id": 2,
"login": "test",
"name": "test_web",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1",
"assignee": true,
"code_owner": false,
"accept": true
}
],
"approval_reviewers": [
{
"id": 2,
"login": "test",
"name": "test_web",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1",
"assignee": true,
"code_owner": false,
"accept": true,
"avatar_url": "https://api.atomgit.com/sytest/paopao/pull/1.png",
"accept_status": "optional"
}
],
"labels": [
{
"id": 222,
"color": "red",
"name": "label1",
"repository_id": 1,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
],
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z",
"closed_at": null,
"merged_at": null,
"draft": false,
"can_merge_check": false,
"prune_branch": false,
"mergeable": true,
"user": {
"id": "userId",
"login": "test",
"name": "test_web",
"avatar_url": "https://api.atomgit.com/avatar.png",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1"
},
"head": {
"label": "test",
"ref": "test",
"sha": "91861a9668041fc1c0ff51d1db66b6297179f5e6",
"repo": {
"path": "paopao",
"name": "paopao",
"namespace": {
"path": "sytest"
},
"full_name": "sytest/paopao",
"html_url": "https://api.atomgit.com/sytest/paopao"
},
"user": {
"id": "userId",
"login": "test",
"name": "test_web",
"avatar_url": "https://api.atomgit.com/avatar.png",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1"
}
},
"base": {
"label": "main",
"ref": "main",
"sha": "91861a9668041fc1c0ff51d1db66b6297179f5e6",
"repo": {
"path": "paopao",
"name": "paopao",
"namespace": {
"path": "sytest"
},
"full_name": "sytest/paopao",
"html_url": "https://api.atomgit.com/sytest/paopao"
}
},
"mergeable_state": {
"merge_request_id": 111,
"state": false,
"status_without_user_auth": false,
"conflict_passed": false,
"branch_missing_passed": true,
"non_ff_passed": true,
"mr_state_passed": true,
"merged_by_user_passed": true,
"work_in_progress_passed": true,
"resolve_discussion_passed": true,
"ci_state_passed": true,
"merge_by_self_passed": true,
"can_force_merge": false,
"approval_reviewers_required_passed": true,
"approval_approvers_required_passed": true,
"approval_testers_required_passed": true,
"merge_request_switch": {
"review_mode": "approval",
"merge_method": "merge",
"only_allow_merge_if_all_discussions_are_resolved": false,
"disable_merge_by_self": false,
"only_allow_merge_if_pipeline_succeeds": false,
"disable_squash_merge": false,
"squash_merge_with_no_merge_commit": false,
"approval_required_reviewers_count": 0,
"approval_required_reviewers_branch": "*",
"add_notes_after_merged": false,
"mark_auto_merged_mr_as_closed": false,
"can_force_merge": false,
"can_reopen": true
},
"reason": {},
"check_tasks_num": 0,
"all_depend_merge_request_merged_passed": true,
"approval_approvers_result": 0,
"approval_testers_result": 0
},
"milestone": {
"created_at": "2024-01-01T00:00:00Z",
"description": "里程碑描述",
"number": 1,
"state": "open",
"title": "里程碑",
"updated_at": "2024-01-01T00:00:00Z"
},
"visibility_reason": "public",
"merged_by": {
"id": "userId",
"login": "test",
"name": "test_web",
"avatar_url": "https://api.atomgit.com/avatar.png",
"html_url": "https://api.atomgit.com/sytest/paopao/pull/1"
},
"close_related_issue": false,
"squash_merge": false
}
错误码¶
| 错误码 | 说明 |
|---|---|
401 |
未认证或凭证无效(缺少/无效的访问凭证) |
400 |
参数错误或请求无法解析 |
404 |
请求路径不存在 |
405 |
请求方法不支持 |
429 |
请求过于频繁,触发限流 |
500 |
系统内部错误 |
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 gitcode-dev/atomgit-api-doc