我一直在对向 ETSY REST API 发送 PUT 请求时的问题进行故障排除, 当我发出 PUT 请求时,我得到一个signature invalid error
。我已经尝试了在谷歌上找到的所有解决方案,但似乎都没有奏效。
如果我指定要进入正文的身份验证参数,则通过 POSTMAN 发送相同的请求是有效的。但是,当我尝试使用python的标准程序复制它时,我得到了相同的invalid signature error
。
即使我从邮递员导出该确切请求的 python 代码,在 python 中运行所述代码时也会出现签名无效错误。
这是我需要发送的 json 数据:
"products": [
{
"product_id":4262200422,
"sku":"00100012",
"property_values":[
{
"property_id":200,
"property_name":"Primary color",
"scale_id":null,
"scale_name":null,
"values":[
"Black"
],
"value_ids":[
1
]
}
],
"offerings":[
{
"offering_id":4128359213,
"price":{
"amount":200,
"divisor":100,
"currency_code":"GBP",
"currency_formatted_short":"\u00a32.00",
"currency_formatted_long":"\u00a32.00 GBP",
"currency_formatted_raw":"2.00"
},
"quantity":12,
"is_enabled":1,
"is_deleted":0
}
],
"is_deleted":0
},
{
"product_id":4031391357,
"sku":"00100013",
"property_values":[
{
"property_id":200,
"property_name":"Primary color",
"scale_id":null,
"scale_name":null,
"values":[
"Bronze"
],
"value_ids":[
1216
]
}
],
"offerings":[
{
"offering_id":4244423138,
"price":{
"amount":300,
"divisor":100,
"currency_code":"GBP",
"currency_formatted_short":"\u00a33.00",
"currency_formatted_long":"\u00a33.00 GBP",
"currency_formatted_raw":"3.00"
},
"quantity":56,
"is_enabled":1,
"is_deleted":0
}
],
"is_deleted":0
}
],
"price_on_property": [200],
"quantity_on_property": [200],
"sku_on_property": [200]
Etsy正在使用Oauth1,POST和GET请求在Python中工作正常,但在POSTMAN中不起作用,返回无效签名错误。
也许他们正在做一些不同的事情来导致这种行为?
我需要构建一个请求,该请求仅获取产品数据,oauth1详细信息并将其发送到Etsy。 请让我知道我错过了什么。
我设法让它工作...事实证明,您不应该在签名计算中包含实际的 OAuth 参数。
这是我用来---类定义发出PUT请求的代码。
class etsyClient:
def __init__(self, consumer_key, consumer_secret, resource_owner_key,
resource_owner_secret):
self.consumer_key = consumer_key
self.consumer_secret = consumer_secret
self.resource_owner_key = resource_owner_key
self.resource_owner_secret = resource_owner_secret
self.oauthclient = self.regen()
def regen(self, sig=oauth1.SIGNATURE_HMAC_SHA1):
client = oauth1.Client(self.consumer_key,
client_secret=self.consumer_secret,
resource_owner_key=self.resource_owner_key,
resource_owner_secret=self.resource_owner_secret,
signature_method=sig)
return client
实际请求代码:
uri, headers, body = self.client.regen(sig=oauth1.SIGNATURE_PLAINTEXT).sign(
f"https://openapi.etsy.com/v2/listings/{self.product.listing.id}/inventory")
r = requests.session()
headers["Content-Type"] = "application/x-www-form-urlencoded"
data = {
"listing_id": self.product.listing.id,
"products": json.dumps(products),
'price_on_property': [200],
'quantity_on_property': [200],
'sku_on_property': [200]
}
a = r.put(uri, headers=headers, data=data)