Created NetSuite Rest Api using C#, Url with Parameter is not working but without url is working

45 Views Asked by At

I tried to use "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&offset=241000" parameter we got error "'Unauthorized', " Also If i use Postman, both way is working fine. please help.

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 Task<ActionResult> 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");
    }
}

}

0

There are 0 best solutions below