ruby-on-rails Ruby on Rails内部API

eiee3dmh  于 2023-03-09  发布在  Ruby
关注(0)|答案(1)|浏览(267)

我有几个关于interal api的一般性问题,我在网上找不到答案。
我了解外部API是如何工作的,例如,如果我的应用程序中有一个端点,那么外部源可以对该端点进行api调用,例如GET,并返回json。
但是我不明白在我自己的应用程序中调用同一个端点(通过一个按钮点击,这将只是一个常规的get请求)之间的区别。这被认为是一个internal API调用,还是只是一个常规的请求,它会根据上下文更改为external
返回值是唯一的区别吗?例如,外部API是json,而内部api将返回代码到视图页面?

j91ykkif

j91ykkif1#

当你点击一个按钮/链接时,它通常会发送一个html请求,由Accept头定义:

def show
  puts request.headers["Accept"]
  # => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
  #     ^^^^^^^^^
  #     it's an html request. it's up to you (and rails) to respond with html
  #     or ignore it and render something else.
end

默认情况下,Rails 将呈现show.html.erb模板,并将Content-Type标头设置为text/html
然后添加show.json.jbuilder,现在可以请求 json 响应而不是 html

// with javascript
fetch("/models/1" , { headers: { Accept: "application/json" } })
  .then(response => response.json())
  .then(json => console.log(json)) // do something with the response

// and in controller you can see
// request.headers["Accept"] # => "application/json"

这是一个 json 请求,因此rails将呈现一个 json 模板。

  • Rails* 还提供了一种不使用头来呈现特定响应的方法,只需在url中添加.json即可,本例中Accept: text/html被Rails忽略,它将呈现一个json模板。

我不记得rails中有任何内部/外部API的概念,只有请求和响应。
如果需要在控制器中添加更多逻辑来处理不同类型的请求,请使用respond_to方法:

def show
  respond_to do |format|
    format.html { render :different_template }
    format.json { render json: {error: "i'm not an api."} }
  end
end

相关问题