"https://[ProductID].<suitetalk.api.netsuite.com/s...
# general
s
"https://[ProductID].suitetalk.api.netsuite.com/services/rest/record/v1/cashSale" url is working in C# rest api, but if I use "https://[ProductID].suitetalk.api.netsuite.com/services/rest/record/v1/cashSale?limit=1000&amp;offset=241000" parameter we got error "'Unauthorized', " Also If i use Postman, both way is working fine. please help.
m
Share your code, most likely the base string key is missing the parameters or they are not escaped or sorted correctly
s
using NetsuiteAPI.Models; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; namespace NetsuiteAPI.Controllers { public class Postqueryv2Controller : Controller { TempdataEntities db = new TempdataEntities(); // GET: Postqueryv2 public ActionResult Index() { return View(); } static string GenerateOAuthHeader(string url, string method, string consumerKey, string consumerSecret, string tokenKey, string tokenSecret) { string oauthNonce = Guid.NewGuid().ToString("N"); string oauthTimestamp = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); // Collect OAuth parameters var parameters = new StringBuilder(); parameters.Append($"oauth_consumer_key={Uri.EscapeDataString(consumerKey)}&"); parameters.Append($"oauth_nonce={Uri.EscapeDataString(oauthNonce)}&"); parameters.Append($"oauth_signature_method=HMAC-SHA256&"); parameters.Append($"oauth_timestamp={Uri.EscapeDataString(oauthTimestamp)}&"); parameters.Append($"oauth_token={Uri.EscapeDataString(tokenKey)}&"); parameters.Append($"oauth_version=1.0"); // Construct the base string string baseString = $"{method.ToUpper()}&{Uri.EscapeDataString(url)}&{Uri.EscapeDataString(parameters.ToString())}"; // Generate the signature string signature = GenerateSignature(baseString, consumerSecret, tokenSecret); // Construct the OAuth header string oauthHeader = $"OAuth realm=\"{Uri.EscapeDataString("[ProductID]")}\",oauth_consumer_key=\"{Uri.EscapeDataString(consumerKey)}\",oauth_token=\"{Uri.EscapeDataString(tokenKey)}\",oauth_signature_method=\"HMAC-SHA256\",oauth_timestamp=\"{Uri.EscapeDataString(oauthTimestamp)}\",oauth_nonce=\"{Uri.EscapeDataString(oauthNonce)}\",oauth_version=\"1.0\",oauth_signature=\"{Uri.EscapeDataString(signature)}\""; return oauthHeader; } static string GenerateSignature(string baseString, string consumerSecret, string tokenSecret) { string key = $"{Uri.EscapeDataString(consumerSecret)}&{Uri.EscapeDataString(tokenSecret)}"; using (var hmac = new HMACSHA256(Encoding.ASCII.GetBytes(key))) { byte[] hashBytes = hmac.ComputeHash(Encoding.ASCII.GetBytes(baseString)); return Convert.ToBase64String(hashBytes); } } public ActionResult ContactAsync() { ViewBag.Message = "Your application description page."; return View(); } public async TaskActionResult ContactAsynce(InventoryT model) { ViewBag.Message = "Your contact page."; string accountId = "[ProductID]"; string consumerKey = "9d9ab41910b9e61c2a080daf02ba8e2cc8f0cfdace1d054cbd1853c0eda819fb"; string consumerSecret = "aa3e39c762d525817ad6725b1a2b653d856fdf66140b8c583f355e309e4dbb2e"; string tokenId = "3d49bead592654b05b4058526e1713ea723285b0c8bbc889f3a6d354c7db30a1"; string tokenSecret = "e39d910ac0faba5cd5152783963c389f6e2b86f6e17c6a484932b02cf9528530"; // NetSuite REST API endpoint var trmp = db.GetUrls.Where(x=>x.Id ==6).FirstOrDefault(); string encodedLimit = System.Web.HttpUtility.UrlEncode("1000"); string encodedOffset = System.Web.HttpUtility.UrlEncode("241000"); string apiUrl = "https://[ProductID].suitetalk.api.netsuite.com/services/rest/record/v1/cashSale?limit=1000&offset=241000"; string Location = model.Location; string ToLocation = model.ToLocation; string ItemName = model.ItemName; double ItemQTY = model.ItemQTY; using (var client = new HttpClient()) { // Implement OAuth 1.0a signing logic here string oauthHeader = GenerateOAuthHeader(apiUrl, "GET", consumerKey, consumerSecret, tokenId, tokenSecret); // Set up the request var request = new HttpRequestMessage(HttpMethod.Get, apiUrl); //request.Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); request.Headers.Add("Authorization", oauthHeader); // Send the request var response = await client.SendAsync(request); // Handle the response if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); TempData["Nicesucc"] = "sdsd"; Console.WriteLine("Inventory transfer successful."); } else { Console.WriteLine($"Error: {response.StatusCode} - {response.ReasonPhrase}"); } } return RedirectToAction("ContactAsync"); } } }
That is C# code
m
You are not adding the parameters (limit/offset) to base string
s
Postman is working that url.
m
Copy code
var parameters = new StringBuilder();
parameters.Append($"oauth_consumer_key={Uri.EscapeDataString(consumerKey)}&");
parameters.Append($"oauth_nonce={Uri.EscapeDataString(oauthNonce)}&");
parameters.Append($"oauth_signature_method=HMAC-SHA256&");
parameters.Append($"oauth_timestamp={Uri.EscapeDataString(oauthTimestamp)}&");
parameters.Append($"oauth_token={Uri.EscapeDataString(tokenKey)}&");
parameters.Append($"oauth_version=1.0");

// Construct the base string
string baseString = $"{method.ToUpper()}&{Uri.EscapeDataString(url)}&{Uri.EscapeDataString(parameters.ToString())}";
The limit and offset parameters have to be added to the base string https://datatracker.ietf.org/doc/html/rfc5849#section-3.4.1
s
Hi , I added "string oauthNonce = Guid.NewGuid().ToString("N"); string oauthTimestamp = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); string limit = "1000"; string offset = "241000"; // Collect OAuth parameters var parameters = new StringBuilder(); parameters.Append($"oauth_consumer_key={Uri.EscapeDataString(consumerKey)}&"); parameters.Append($"oauth_nonce={Uri.EscapeDataString(oauthNonce)}&"); parameters.Append($"oauth_signature_method=HMAC-SHA256&"); parameters.Append($"oauth_timestamp={Uri.EscapeDataString(oauthTimestamp)}&"); parameters.Append($"oauth_token={Uri.EscapeDataString(tokenKey)}&"); parameters.Append($"oauth_version=1.0"); parameters.Append($"limit={Uri.EscapeDataString(limit)}&offset={Uri.EscapeDataString(offset)}"); / I added this one but I am not sure it is correct? // Construct the base string string baseString = $"{method.ToUpper()}&{Uri.EscapeDataString(url)}&{Uri.EscapeDataString(parameters.ToString())}";" to my code but I still got Authorize problem using that Request Parameter limit and offset issue..
m
Parameters need to be sorted alphabetically
s
So, var parameters = new StringBuilder(); parameters.Append($"limit={Uri.EscapeDataString(limit)}&offset={Uri.EscapeDataString(offset)}"); parameters.Append($"oauth_consumer_key={Uri.EscapeDataString(consumerKey)}&"); parameters.Append($"oauth_nonce={Uri.EscapeDataString(oauthNonce)}&"); parameters.Append($"oauth_signature_method=HMAC-SHA256&"); parameters.Append($"oauth_timestamp={Uri.EscapeDataString(oauthTimestamp)}&"); parameters.Append($"oauth_token={Uri.EscapeDataString(tokenKey)}&"); parameters.Append($"oauth_version=1.0");
"parameters.Append($"limit={Uri.EscapeDataString(limit)}&offset={Uri.EscapeDataString(offset)}");" is correct?