ruby 403“系统出错了”(403“系统出错”)

vmdwslir  于 2023-01-12  发布在  Ruby
关注(0)|答案(1)|浏览(114)

我正在尝试使用httparty gem实现post操作,这是我所拥有的。我正在docker中运行所有内容,下面的代码将作为活动作业运行。我在一个服务中,我正在尝试在其他服务中发布API。我能够获取,但没有任何与发布的运气。我在网上看了很多,搜索了很多,但是我不确定我做错了什么。我总是在self.class.post行得到错误403。我还尝试做一个 Postman 调用API,我能够击中api,但与下面的代码,它甚至没有达到其他服务。
任何帮助都很感激。谢谢。

require 'uri'

class CustomerProductAPI
  include HTTParty
  format :json

  def initialize(customer_product_id)
    @customer_product = CustomerProduct.find(customer_product_id)
    @customer = Customer.find(@customer_product.student_id)
    @product = Product.find(@customer_product.product_id)
    self.class.base_uri environment_based_uri + '/customer_product_api'
  end

  def create_customer_product
    uri = URI(self.class.base_uri + "/customer/#{customer.id}")
    self.class.post(uri, body: body_hash).response.value
  end

  private

  attr_reader :customer_product, :customer, :product

  def body_hash
    {
      token: ENV['CUSTOMER_PRODUCT_API_TOKEN'],
      customer: customer.name,
      product: product.name,
    }
  end

  def environment_based_uri
    ENV['CUSTOMER_PRODUCT_URL']
  end
end
a0x5cqrl

a0x5cqrl1#

虽然我们实际上不能确切地确定接受响应的服务器期望什么,但您肯定在这里做了相当多的非惯用的事情,这将聚集故障排除。

  • base_uri应该只在类体中设置。而不是在每个示例的initialize中设置。您也不需要使用HTTParty构造URI。只需传递一个路径,它将构造相对于base_uri的请求URI。
  • 当从ENV获取配置时,使用ENV.fetch而不是括号访问器,因为它将引发KeyError,而不是让nil偷偷通过。
  • 你的HTTP客户端类不应该关心查询数据库和处理可能发生的错误,如果找不到记录。这应该是调用客户端的控制器/作业/服务对象的责任。因为你实际上只使用了三个简单的属性,它实际上根本不需要记录作为输入,实际上它最好不使用记录。Don "不必了解您的模型及其关联(在本例中是缺少关联)。
class CustomerProductAPI
  # lets you stub/inspect the constant
  CUSTOMER_PRODUCT_URL = ENV.fetch('CUSTOMER_PRODUCT_URL') + '/customer_product_api'

  include HTTParty
  format :json
  base_uri CUSTOMER_PRODUCT_URL 

  def initialize(id:, product_name:, customer_name:)
    @id = id
    @product_name = product_name
    @customer_name = customer_name
  end

  def create_customer_product
    self.class.post("/customer/#{@id}", body: {
      token: ENV.fetch('CUSTOMER_PRODUCT_API_TOKEN'),
      customer: @customer_name,
      product: @product_name
    })
    # don't return .response.value as it will make error handling impossible. 
    # either handle unsuccessful responses here or return the whole response 
    # for the consumer to handle it.
  end
end

相关问题