通过API更新Etsy中的列表(签名无效)

时间:2019-02-19 08:30:15

标签: c# put signature oauth-1.0a etsy

我目前正在使用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

0 个答案:

没有答案