#c# #rest #netsuite #restsharp #oauth-1.0a
#c# #остальное #нетсуит #рестшарп #oauth-1.0 a
Вопрос:
Теперь я пытаюсь подключиться к rest api Netsuite SuiteTalk в приложении C# с помощью RestSharp. Но он возвращает несанкционированную ошибку(401). (Вызов api с помощью Postman работает) Мой код выглядит следующим образом.
public string generateSignature(string httpMethod, string timestamp, string nonce, SortedDictionarylt;string, stringgt; data) { var parameters = new SortedDictionarylt;string, stringgt; { {"oauth_consumer_key", mConfig.ConsumerKey}, { "oauth_token", mConfig.TokenId }, {"oauth_signature_method", "HMAC-SHA256"}, {"oauth_timestamp", timestamp}, {"oauth_nonce", nonce}, {"oauth_version", "1.0"} }; foreach (KeyValuePairlt;string, stringgt; elt in data) { parameters.Add(elt.Key, elt.Value); } string Signature_Base_String = httpMethod; Signature_Base_String = Signature_Base_String.ToUpper(); Signature_Base_String = Signature_Base_String "amp;"; string PercentEncodedURL = Uri.EscapeDataString(netsuite_base_url); Signature_Base_String = Signature_Base_String PercentEncodedURL; Signature_Base_String = Signature_Base_String "amp;"; bool first = true; foreach (KeyValuePairlt;string, stringgt; elt in parameters) { if (first) { Signature_Base_String = Signature_Base_String Uri.EscapeDataString(elt.Key "=" elt.Value); first = false; } else { Signature_Base_String = Signature_Base_String Uri.EscapeDataString("amp;" elt.Key "=" elt.Value); } } string key = mConfig.ConsumerSecret "amp;" mConfig.TokenSecret; string signature = ""; var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(key); byte[] messageBytes = encoding.GetBytes(Signature_Base_String); using (var myhmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = myhmacsha256.ComputeHash(messageBytes); signature = Uri.EscapeDataString(Convert.ToBase64String(hashmessage)); } return signature; } public bool getData() { string timestamp = computeTimestamp();// ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); string nonce = Convert.ToBase64String(Encoding.UTF8.GetBytes(timestamp));// computeNonce(); var data = new SortedDictionarylt;string, stringgt;{ { "q", query} }; string signature = generateSignature("GET", timestamp, nonce, data); netSuiteAuthorization = "OAuth " "realm=" """ mConfig.AccountId """ "," "oauth_consumer_key=" """ mConfig.ConsumerKey """ "," "oauth_token=" """ mConfig.TokenId """ "," "oauth_signature_method=" """ SIGNATURE_METHOD """ "," "oauth_timestamp=" """ timestamp """ "," "oauth_nonce=" """ nonce """ "," "oauth_version=" """ "1.0" """ "," "oauth_signature= " """ signature """; var client = new RestClient(netsuite_base_url); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", netSuiteAuthorization); request.AddHeader("Content-Type", "application/json"); request.AddQueryParameter("q", query); IRestResponse response = client.Execute(request); ... do something .... }
Я думаю, что функция подписи правильна. Но я не могу понять причину ошибки 401. Чего мне не хватает в коде? Если у кого-то есть опыт, пожалуйста, помогите мне.
Ответ №1:
я предполагаю, что realm=»номер учетной записи» отсутствует, попробуйте обновить область в подписи
Комментарии:
1. Спасибо за ваш ответ. Мне очень жаль, но, насколько я знаю, риэлм не для подписи. Также я пробовал, но это не работает.
2. Как вы упомянули, он работает в postman, создайте журнал подписи в своем сценарии и используйте его в postman, что может помочь отследить.
Ответ №2:
Наконец-то я нашел проблему. Мне не следовало добавлять следующую строку
request.AddQueryParameter("q", query);
И когда я использую строку netsuite_base_url, URL-адрес должен быть в нижнем регистре.