我目前正在使用Etsy API和oAuth1.0。经过一些麻烦和花费数小时后,我得到了GET / POST请求,并且一切运行良好,直到现在。看来,通过C#计算的签名(不使用库)是错误的(oauth签名无效),而且我还认为我发送的数据格式错误。我对代码做了一些更改,却迷失了麻烦。我正在使用.net 4.5,并且必须在此版本中执行此操作,无法进行任何更新或降级。如果您可以为可正确更新列表的PUT请求添加一个有效的代码段,那就太好了。
我发送的链接:
https://openapi.etsy.com/v2/listings/681233703?title=Updated%20minimalistic%20Title&oauth_consumer_key=CONSUMERKEYHERE&oauth_token=OAUTHTOKENHERE&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1550565715&oauth_nonce=4iF0YjiRlbUkAChw2wPhAzL1qEU=&oauth_version=1.0&oauth_signature=SIGNATUREHERE=
当前错误:oauth_problem=signature_invalid&debug_sbs=PUT&https%3A%2F%2Fopenapi.etsy.com%2Fv2%2Flistings%2F681233703&oauth_consumer_key%CONSUMERKEYHERE%26oauth_nonce%3DOyU9cBS3eG4%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1550565838%26oauth_token%OUTHTOKENHERE%26oauth_version%3D1.0%26title%3DUpdated%2520minimalistic%2520Title
开机自检
// Timestamps are in seconds since 1/1/1970.
string fullUrl = EtsyBaseUrl + url;
string data = JsonConvert.SerializeObject(dic);
Dictionary<string, string> data_dic = getOAuthDataDictionary(fullUrl, "POST");
string oAuthHeader = GenerateOAuthHeader(data_dic);
// Build the form data (exclude OAuth stuff that's already in the header).
var formData = new FormUrlEncodedContent(data_dic.Where(kvp => !kvp.Key.StartsWith("oauth_")));
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Add("Authorization", oAuthHeader);
HttpContent httpData = new StringContent(data, Encoding.UTF8, "application/json");
var httpResp = await http.PostAsync(fullUrl, httpData);
var respBody = await httpResp.Content.ReadAsStringAsync();
return respBody;
}
我的PUT请求无效
try
{
// Timestamps are in seconds since 1/1/1970.
string fullUrl = EtsyBaseUrl + url;
Dictionary<string, string> data_dic = getOAuthDataDictionary(fullUrl, "PUT");
string oAuthParam = GenerateOAuthParam(data_dic);
string oAuthHeader = GenerateOAuthHeader(data_dic);
// Build the form data (exclude OAuth stuff that's already in the header).
var formData = new FormUrlEncodedContent(data_dic.Where(kvp => !kvp.Key.StartsWith("oauth_")));
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Add("Authorization", oAuthHeader);
var url2 = string.Format(fullUrl + "?" + string.Join("&",dic.Select(kvp =>string.Format($"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}")))) + oAuthParam; //TODO
Debug.WriteLine(url2);
HttpContent httpData = new StringContent(url2, Encoding.ASCII, "application/x-www-form-urlencoded");
Debug.WriteLine(await httpData.ReadAsStringAsync());
var httpResp = await http.PutAsync(fullUrl, httpData);
var respBody = await httpResp.Content.ReadAsStringAsync();
Debug.WriteLine(respBody);
return respBody;
}
}
catch(Exception er)
{
Console.WriteLine(er.Message);
return null;
}
更新1 删除title参数后,请求运行正常,添加请求后,出现签名无效错误。
更新2 当我将“ application / x-www-form-urlencoded”更改为“ application / json”并传递参数时,放置请求通过,但是etsy无法识别任何参数,从而导致标题:null