Search code examples
c#restsharp

Creating Restsharp call to add parameters in an array


I need to send the following parameters to an AP using Restsharp in my C# console app

I have looked on here and on other sites, but not found anything that I can get to work.

This is what the raw code looks like

 {
"LicenceNumber":"511237P",
"CardNumber":"DB07067",
"ExternalID":"ID56758",
"Comments":"data uploaded via automated weekly process",
"Rules":"EU",
"Activities": [
    {
        "StartTime":"2019-04-14 09:00:00",
        "Duration":"480",
        "ActivityType":"Rest"
    }
    ]
 }

What I need to do is use the Restsharp request.AddAddParameter to add the StartTime, Duration and ActivityType to the Activities but I am not sure how to proceed.

What I have so far is the following:

        static void PostRecord(string url)
    {
        url = url + "/" + MembershipNumber;
        var client = new RestClient(url);
        var request = new RestRequest(Method.POST);
        request.AddHeader("Authorization", "Bearer " + Token);
        request.AddParameter("LicenceNumber", LicenceNumber);
        request.AddParameter("CardNumber", CardNumber);
        request.AddParameter("ExternalID", ExternalID);
        request.AddParameter("Comments", Comments);
        request.AddParameter("Rules", Rules);
        request.AddParameter("Activities", "Activities");

    }

Any help would be much appreciated

****** UPDATE ********** I have amended my code after some more investigation it runs but says that the Activities details must be supplied so its not recognising the values in the array

        url = url + "/" + MembershipNumber;
        var client = new RestClient(url);
        var request = new RestRequest(Method.POST);
        var Activities= new Dictionary<string, object>();
        Activities.Add("StartTime", "2019-04-14 09:00:00");
        Activities.Add("Duration", "480");
        Activities.Add("ActivityType", "Rest");
        JsonObject o = new JsonObject();
        foreach (var kvp in Activities)
        {
            o.Add(kvp);
        }
        JsonArray array = new JsonArray();
        array.Add(o);
        request.AddHeader("Authorization", "Bearer " + Token);
        request.AddHeader("Content-Type", "application/json");
        request.AddParameter("LicenceNumber", LicenceNumber);
        request.AddParameter("CardNumber", CardNumber);
        request.AddParameter("ExternalID", ExternalID);
        request.AddParameter("Comments", Comments);
        request.AddParameter("Rules", Rules);
        request.AddParameter("Activities", array.ToString());
        IRestResponse response = client.Execute(request);

Solution

  • Create a object and then assign your values to it accordingly:

    public class Activity
    {
        public string StartTime { get; set; }
        public string Duration { get; set; }
        public string ActivityType { get; set; }
    }
    
    public class RootObject
    {
        public string LicenceNumber { get; set; }
        public string CardNumber { get; set; }
        public List<Activity> Activities { get; set; }
    }
    

    You can use Auto Properties you can generate them from a website such as this

    Then you can create an instance of that class and assign all the values you need like so:

    url = url + "/" + MembershipNumber;
    var client = new RestClient(url);
    var request = new RestRequest(Method.POST);
    
    request.AddHeader("Authorization", "Bearer " + Token);
    // This how you assign your values for the RootObject class
    RootObject MyObject = RootObject();
    MyObject.LicenceNumber  = LicenceNumber;
    MyObject.CardNumber = CardNumber;
    
    // then for the activities class you can do the following
    
    MyObject.Activities = new List<Activity>();
    MyObject.Activities.Add(new Activity(){StartTime = "2019-04-14 09:00:00", Duration = "480",ActivityType = "Rest"});
    string jsonString = JsonConvert.SerializeObject(MyObject);
    request.AddParameter("application/json", jsonString, ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);