208 lines
7.9 KiB
Markdown
208 lines
7.9 KiB
Markdown
---
|
||
title: 路由
|
||
description: HTTP 方法如何映射到控制器与操作。
|
||
menu:
|
||
docs:
|
||
weight: 40
|
||
parent: dev
|
||
---
|
||
|
||
{{< caption-link url="https://github.com/mastodon/mastodon/blob/main/config/routes.rb" caption="config/routes.rb" >}}
|
||
|
||
## 路由说明 {#routes}
|
||
|
||
Mastodon 使用 Ruby on Rails,它在 config/routes.rb 中定义其路由配置。本页只解释 Mastodon 如何处理路由的基础知识,你可以查看 [Ruby on Rails 路由指南](https://guides.rubyonrails.org/routing.html) 以获取更详细的信息。
|
||
|
||
### 路由的构建方式 {#router}
|
||
|
||
`namespace` 是映射到特定控制器目录的路由的前缀。`resources` 映射到该命名空间目录中的控制器。`scope` 传递到 `module` 的控制器。例如,考虑以下缩写代码:
|
||
|
||
{{< code title="config/routes.rb 摘录" >}}
|
||
```ruby
|
||
namespace :api do
|
||
namespace :v1 do
|
||
resources :statuses, only [:create, :show, :destroy] do
|
||
scope module: :statuses do
|
||
resource :favourite, only: :create
|
||
resource :unfavourite, to: 'favourites#destroy'
|
||
member do
|
||
get :context
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
```
|
||
{{< /code >}}
|
||
|
||
第一个可用的资源是 :statuses,它嵌套在 :api 和 :v1 命名空间下。因此,生成的 HTTP 路由将是 /api/v1/statuses。`only` 定义某些允许的方法,这些方法将在 `app/controllers/api/v1/statuses_controller.rb` 的控制器中定义。
|
||
|
||
在 /api/v1/statuses 中,有一个模块 :statuses 的作用域,其中定义了其他资源。这些资源的控制器位于 `app/controllers/api/v1/statuses/` 中。例如,:favourite 将由 `app/controllers/api/v1/statuses/favourites_controller.rb` 中的 #create 操作处理,而 :unfavourite 将由同一控制器中的 #destroy 操作处理。
|
||
|
||
还为该作用域内的任何 `member` 定义了一个自定义方法,或者换句话说,对于任何要由 `app/controllers/api/v1/statuses_controller.rb` 控制的状态,该方法都映射到 GET /api/v1/statuses/:id/context 并且由该控制器中定义的 :context 操作处理。
|
||
|
||
### 可用方法 {#methods}
|
||
|
||
#### :index
|
||
|
||
映射到 HTTP GET,用于列出。由控制器中的 #index 操作处理。
|
||
|
||
#### :show
|
||
|
||
映射到 HTTP GET,用于显示单个视图。由控制器中的 #show 操作处理。
|
||
|
||
#### :create
|
||
|
||
映射到 HTTP POST。由控制器中的 #create 操作处理。
|
||
|
||
#### :update
|
||
|
||
映射到 HTTP PUT。由控制器中的 #update 操作处理。
|
||
|
||
#### :destroy
|
||
|
||
映射到 HTTP DELETE。由控制器中的 #destroy 操作处理。
|
||
|
||
## .well-known {#well-known}
|
||
|
||
### /.well-known/host-meta {#host-meta}
|
||
|
||
可扩展资源描述符 (XRD)。 声明 Webfinger 的存在。
|
||
|
||
### /.well-known/nodeinfo {#nodeinfo}
|
||
|
||
映射到 `/nodeinfo/2.0` 的 NodeInfo 2.0 端点,用于声明软件名称和版本、协议、使用统计信息以及是否开放注册。
|
||
|
||
### /.well-known/webfinger {#webfinger}
|
||
|
||
用于发现 ActivityPub 行为体 ID。有关更多信息,请查看 [对 > WebFinger 的合规性说明]({{< relref "spec/webfinger" >}})。
|
||
|
||
### /.well-known/change-password {#change-password}
|
||
|
||
映射到帐户设置页面。
|
||
|
||
### /.well-known/keybase-proof-config {#keybase}
|
||
|
||
用于与 Keybase 集成,定义哪些用户名可接受以及可以在哪里检查证明。
|
||
|
||
{{< hint style="warning" >}}
|
||
以下部分正在建设中。
|
||
{{< /hint >}}
|
||
|
||
## 公开 URI {#public}
|
||
|
||
* `/users/username` = 用户 URI
|
||
* `/users/username/remote_follow` = 外站关注对话框
|
||
* `/users/username/statuses/id` = 嘟文 URI
|
||
* `/@username` = “嘟文”选项卡
|
||
* `/@username/with_replies` = “嘟文与回复”选项卡
|
||
* `/@username/media` = “媒体”选项卡
|
||
* `/@username/tagged/:hashtag` = 用户标记的嘟文
|
||
* `/@username/:status_id` = 嘟文永久链接
|
||
* `/@username/:status_id/embed` = 可嵌入版本
|
||
* `/interact/:status_id` = 外站交互对话框
|
||
* `/explore` = 用户目录
|
||
* `/explore/:hashtag` = 简介中包含此标签的用户
|
||
* `/public` = 公共时间线预览
|
||
* `/about` = 落地页
|
||
* `/about/more` = 详细描述
|
||
* `/terms` = 服务条款
|
||
|
||
## API {#api}
|
||
|
||
* /api/oembed
|
||
* /api/proofs
|
||
* /api/v1
|
||
* [statuses]({{< relref "methods/statuses" >}}) [create, show, destroy]
|
||
* reblogged_by [index]
|
||
* favourited_by [index]
|
||
* reblog [create]
|
||
* unreblog [POST reblog#destroy]
|
||
* favourite [create]
|
||
* unfavourite [POST favourites#destroy]
|
||
* bookmark [create]
|
||
* unbookmark [POST bookmarks#destroy]
|
||
* mute [create]
|
||
* unmute [POST mutes#destroy]
|
||
* pin [create]
|
||
* unpin [POST pins#destroy]
|
||
* context [GET]
|
||
* [timelines]({{< relref "methods/timelines" >}})
|
||
* home [show]
|
||
* public [show]
|
||
* tag [show]
|
||
* list [show]
|
||
* [streaming]({{< relref "methods/streaming" >}}) [index]
|
||
* [custom_emojis]({{< relref "methods/custom_emojis" >}}) [index]
|
||
* [suggestions]({{< relref "methods/suggestions" >}}) [index, destroy]
|
||
* [scheduled_statuses]({{< relref "methods/scheduled_statuses" >}}) [index, show, update, destroy]
|
||
* [preferences]({{< relref "methods/preferences" >}}) [index]
|
||
* [conversations]({{< relref "methods/conversations" >}}) [index, destroy]
|
||
* read [POST]
|
||
* [media]({{< relref "methods/media" >}}) [create, update]
|
||
* [blocks]({{< relref "methods/blocks" >}}) [index]
|
||
* [mutes]({{< relref "methods/mutes" >}}) [index]
|
||
* [favourites]({{< relref "methods/favourites" >}}) [index]
|
||
* [bookmarks]({{< relref "methods/bookmarks" >}}) [index]
|
||
* [reports]({{< relref "methods/reports" >}}) [create]
|
||
* [trends]({{< relref "methods/trends" >}}) [index]
|
||
* [filters]({{< relref "methods/filters" >}}) [index, create, show, update, destroy]
|
||
* [endorsements]({{< relref "methods/endorsements" >}}) [index]
|
||
* [markers]({{< relref "methods/markers" >}}) [index, create]
|
||
* [apps]({{< relref "methods/apps" >}}) [create]
|
||
* verify_credentials [credentials#show]
|
||
* [instance]({{< relref "methods/instance" >}}) [show]
|
||
* peers [index]
|
||
* activity [show]
|
||
* [domain_blocks]({{< relref "methods/domain_blocks" >}}) [show, create, destroy]
|
||
* [directory]({{< relref "methods/directory" >}}) [show]
|
||
* [follow_requests]({{< relref "methods/follow_requests" >}}) [index]
|
||
* authorize [POST]
|
||
* reject [POST]
|
||
* [notifications]({{< relref "methods/notifications" >}}) [index, show]
|
||
* clear [POST]
|
||
* dismiss [POST]
|
||
* [accounts]({{< relref "methods/accounts" >}})
|
||
* verify_credentials [GET credentials#show]
|
||
* update_credentials [PATCH credentials#update]
|
||
* search [show (search#index)]
|
||
* relationships [index]
|
||
* [accounts]({{< relref "methods/accounts" >}}) [create, show]
|
||
* statuses [index accounts/statuses]
|
||
* followers [index accounts/follower_accounts]
|
||
* following [index accounts/following_accounts]
|
||
* lists [index accounts/lists]
|
||
* identity_proofs [index accounts/identity_proofs]
|
||
* follow [POST]
|
||
* unfollow [POST]
|
||
* block [POST]
|
||
* unblock [POST]
|
||
* mute [POST]
|
||
* unmute [POST]
|
||
* pin [POST]
|
||
* unpin [POST]
|
||
* [lists]({{< relref "methods/lists" >}}) [index, create, show, update, destroy]
|
||
* accounts [POST accounts/pins#destroy]
|
||
* [featured_tags]({{< relref "methods/featured_tags" >}}) [index, create, destroy]
|
||
* suggestions [GET suggestions#index]
|
||
* [polls]({{< relref "methods/polls" >}}) [create, show]
|
||
* votes [create polls/votes]
|
||
* [push]({{< relref "methods/push" >}})
|
||
* subscription [create, show, update, destroy]
|
||
* [admin]({{< relref "methods/admin" >}})
|
||
* accounts [index, show]
|
||
* enable [POST]
|
||
* unsilence [POST]
|
||
* unsuspend [POST]
|
||
* approve [POST]
|
||
* reject [POST]
|
||
* action [create account_actions]
|
||
* reports [index, show]
|
||
* assign_to_self [POST]
|
||
* unassign [POST]
|
||
* reopen [POST]
|
||
* resolve [POST]
|
||
* /api/v2
|
||
* [search]({{< relref "methods/search" >}}) [GET search#index]
|
||
|
||
{{< translation-status-zh-cn raw_title="Routes" raw_link="/dev/routes/" last_translation_time="2025-04-21" raw_commit="6addd5cf525adec1859f48c52dafcfe1f96e558a">}}
|