【问题标题】:Error Creating Shipment for an Order in Ebay在 Ebay 中为订单创建货件时出错
【发布时间】:2020-08-24 11:24:57
【问题描述】:

这个错误已经困扰了我大约一周...我正在尝试在 Ebay 中创建一个货件,但我在响应中收到 500 错误代码。这是文档的链接https://developer.ebay.com/api-docs/sell/fulfillment/resources/order/shipping_fulfillment/methods/createShippingFulfillment

我在生产环境中运行这段代码:

  @header = {
    'Content-Type': 'application/json',
    'Authorization': "Bearer #{@token}"
  }

  uri = URI.parse("https://api.ebay.com/sell/fulfillment/v1/order/#{order.order_number}/shipping_fulfillment")

  # Create the HTTP objects
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  items = []
  order.items.each do |i|
    items << {"lineItemId": i[:id]}
  end
  params = {
    "lineItems": items,
    "shippedDate": Time.parse(date).strftime("%Y-%m-%dT%H:%M:%S.000Z"),
    "shippingCarrierCode": "USPS",
    "trackingNumber": tracking_number
  }

  request = Net::HTTP::Post.new(uri.request_uri, @header)


  request.body = params.to_json
  response = http.request(request)
  puts response.code #prints 500

我的错误:

{"errors": [{
"errorId": 2003,
"domain": "ACCESS",
"category": "APPLICATION",
"message": "Internal error",
"longMessage": "There was a problem with an eBay internal system or process. Contact eBay developer support for assistance",
"parameters": [{
    "name": "reason",
    "value": "Failed to transform underlying error response, see logs."
}]
}]}

我已为高级开发者支持付费,但尚未收到回复。任何帮助将不胜感激。我试过用一个空的正文提交相同的请求,但这不会改变响应。我也尝试过更改标题。如果我添加'Accept': 'application/json',那么我会收到一个空正文的 500 错误。这没有任何意义。

更新

根据 cmets 中的建议,我尝试将 params 哈希更改为:

params = {
    "lineItems": "[{\"lineItemId\":10025031700524,\"quantity\":1}]",
    "shippedDate": "2020-05-01T08:05:00.000Z",
    "shippingCarrierCode": "USPS",
    "trackingNumber": "9400111899562795104724"
  }

我也尝试过运行后续请求。我还尝试在正文中提交以下 JSON:

request.body = {
    "lineItems": [
      {
        "lineItemId": "10025031700524",
        "quantity": "1"
      }
    ],
    "shippedDate": "2020-05-01T08:05:00.000Z",
    "shippingCarrierCode": "USPS",
    "trackingNumber": "9400111899562795104724"
  }.to_json

每次尝试都会产生与以前完全相同的错误。我也尝试将数量更改为整数和字符串。

更新 2

以下是我的请求内容:

POST /sell/fulfillment/v1/order/24-04954-08727/shipping_fulfillment
content-type: application/json
authorization: Bearer v#i^1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
accept: */*
user-agent: Ruby
connection: close
host: api.ebay.com
content-length: 159
content-type: application/x-www-form-urlencoded
{"lineItems":[{"lineItemId":"10025031700524"}],"shippedDate":"2020-05- 01T08:05:00.000Z","shippingCarrierCode":"USPS","trackingNumber":"9400111899562795104724"}

【问题讨论】:

  • @Canon 他们在他们的文档中有这个关于这个端点的奇怪注释:Note: In some cases, this call may succeed if you issue it once more after receiving this error. 你注意到了吗?尝试他们的建议作为调试步骤
  • 尝试将"quantity" : 1 添加到您的订单项对象中,看看会有什么响应,因为我可以看到他们没有明确说明它是否是可选的。
  • 我从他们的文档中获取了这个:[{ "lineItemId": 6254458011, "quantity": 1 }],然后将其转换为to_json,然后得到:"[{\"lineItemId\":6254458011,\"quantity\":1}]",它将lineItemId 作为整数而不是字符串发送。
  • 直接使用 Net::HTTP 总是让人头疼,因为很容易把自己踢到脚上。我建议使用像github.com/jnunemaker/httparty 这样的更高级别的库重试。以下是使用 HTTParty 发出此类请求的示例:stackoverflow.com/q/7455744/3784008
  • @anothermh httparty 工作。我传递了所有与 net/http 相同的标头和正文参数。只是看起来很奇怪。

标签: ruby ebay-api


【解决方案1】:

在请求内容中:

POST /sell/fulfillment/v1/order/24-04954-08727/shipping_fulfillment
content-type: application/json
authorization: Bearer v#i^1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
accept: */*
user-agent: Ruby
connection: close
host: api.ebay.com
content-length: 159
content-type: application/x-www-form-urlencoded
{"lineItems":[{"lineItemId":"10025031700524"}],"shippedDate":"2020-05- 01T08:05:00.000Z","shippingCarrierCode":"USPS","trackingNumber":"9400111899562795104724"}

我突然想到content-type 出现了两次。

在 irb 中运行一些示例后,net/http 库似乎适用于字符串,而不适用于符号。通过在您的 @header 定义中包含 :,键被解释为符号。

引用Ruby documentation

哈希

使用{} 之间的键值对创建哈希:

{ "a" => 1, "b" => 2 }

键和值都可以是任何对象。

您可以使用符号键创建散列,语法如下:

{ a: 1, b: 2 }

同样的语法用于方法的关键字参数。

Symbol 文字一样,您可以引用符号键。

{ "a 1": 1, "b #{1 + 1}": 2 }

等于

{ :"a 1" => 1, :"b 2" => 2 }

请参阅Hash 了解您可以与哈希一起使用的方法。

要使用字符串键,请使用 =&gt; 而不是 :

对你来说,这意味着改变:

@header = {
  'Content-Type': 'application/json',
  'Authorization': "Bearer #{@token}"
}

进入:

@header = {
  'Content-Type' => 'application/json',
  'Authorization' => "Bearer #{@token}"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多