Вызовите REST Api с помощью OAuth1.0 для netsuite SuiteTalk в приложении C#

#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-адрес должен быть в нижнем регистре.