Jui Test
Jui Test

Reputation: 2409

How to consume rest api in C#

I want to consume rest api having post method in my project (web)/Windows service(C#).

Url : https://sampleurl.com/api1/token

I need to pass username and password for generating token. I have written code like this.

string sURL = "https://sampleurl.com/api1/token/Actualusername/Actualpassword";
            WebRequest wrGETURL;
            wrGETURL = WebRequest.Create(sURL);

            wrGETURL.Method = "POST";
            wrGETURL.ContentType = @"application/json; charset=utf-8";
            wrGETURL.ContentLength = 0;
            HttpWebResponse webresponse = wrGETURL.GetResponse() as HttpWebResponse;

            Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
            // read response stream from response object
            StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(), enc);
            // read string from stream data
            string  strResult = loResponseStream.ReadToEnd();
            // close the stream object
            loResponseStream.Close();
            // close the response object
            webresponse.Close();

            Response.Write(strResult);

I am getting error: No connection could be made because the target machine actively refused it

Is it right way to consume rest api in C#?

Upvotes: 3

Views: 21878

Answers (2)

Pramod Lawate
Pramod Lawate

Reputation: 1031

Consume API with Basic Authentication in C#

 class Program
{
    static void Main(string[] args)
    {
        BaseClient clientbase = new BaseClient("https://website.com/api/v2/", "username", "password");
        BaseResponse response = new BaseResponse();
        BaseResponse response = clientbase.GetCallV2Async("Candidate").Result;
    }


    public async Task<BaseResponse> GetCallAsync(string endpoint)
    {
        try
        {
            HttpResponseMessage response = await client.GetAsync(endpoint + "/").ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {
                baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                baseresponse.StatusCode = (int)response.StatusCode;
            }
            else
            {
                baseresponse.ResponseMessage = await response.Content.ReadAsStringAsync();
                baseresponse.StatusCode = (int)response.StatusCode;
            }
            return baseresponse;
        }
        catch (Exception ex)
        {
            baseresponse.StatusCode = 0;
            baseresponse.ResponseMessage = (ex.Message ?? ex.InnerException.ToString());
        }
        return baseresponse;
    }
}


public class BaseResponse
{
    public int StatusCode { get; set; }
    public string ResponseMessage { get; set; }
}

public class BaseClient
{
    readonly HttpClient client;
    readonly BaseResponse baseresponse;

    public BaseClient(string baseAddress, string username, string password)
    {
        HttpClientHandler handler = new HttpClientHandler()
        {
            Proxy = new WebProxy("http://127.0.0.1:8888"),
            UseProxy = false,
        };

        client = new HttpClient(handler);
        client.BaseAddress = new Uri(baseAddress);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var byteArray = Encoding.ASCII.GetBytes(username + ":" + password);

        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

        baseresponse = new BaseResponse();

    }
}

Upvotes: 0

robjam
robjam

Reputation: 989

This all very much depend on the API's documentation, but to write data to the request body, get the request stream and then write the string to the stream. again, this depends on what the API you are authenticating with and without knowing which one is guesswork on my part.

        string sURL = "https://sampleurl.com/api1/token";
        WebRequest wrGETURL;
        wrGETURL = WebRequest.Create(sURL);

        wrGETURL.Method = "POST";
        wrGETURL.ContentType = @"application/json; charset=utf-8";
        using (var stream = new StreamWriter(wrGETURL.GetRequestStream()))
        {
            var bodyContent = new
            {
                username = "Actualusername",
                password = "Actualpassword"
            }; // This will need to be changed to an actual class after finding what the specification sheet requires.

            var json = JsonConvert.SerializeObject(bodyContent);

            stream.Write(json);
        }
        HttpWebResponse webresponse = wrGETURL.GetResponse() as HttpWebResponse;

        Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
        // read response stream from response object
        StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(), enc);
        // read string from stream data
        string strResult = loResponseStream.ReadToEnd();
        // close the stream object
        loResponseStream.Close();
        // close the response object
        webresponse.Close();

        Response.Write(strResult);

Upvotes: 3

Related Questions