В настоящее время я работаю с Etsy API и oAuth1.0.После некоторых хлопот и потраченных часов я получил запрос GET / POST, и до сих пор все было хорошо.Кажется, что подпись, которая рассчитывается с помощью C # (без использования библиотеки), неверна (или подпись недействительна), и я также считаю, что данные, которые я отправляю, отформатированы неправильно.Я сделал некоторые изменения в коде и потерян в беде.Я использую .net 4.5 и HAVE, чтобы сделать это в этой версии, обновление или понижение версии невозможны.Было бы здорово, если бы вы могли прокомментировать рабочий фрагмент кода для запроса 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
Рабочий POST
// 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" и передаю параметры, запрос putпроходит, но etsy не распознает никаких параметров, что приводит к заголовку: null