In this example I am indeed passing the parameters as query parameters. If your API consumes from the body of the call, you could wrap up the parameters and add them to the body. I have an example (not Epicor but using C#) below adding parameters to the body of an API call using the RestSharp library.
/// <summary>
/// Invokes an Epicor Function from the specific function library
/// </summary>
/// <param name="library">The Library ID associated with the function</param>
/// <param name="functionID">The Function ID to be invoked</param>
/// <param name="fxRequest">The JSON from the call body representing the optional input parameters</param>
/// <returns></returns>
public async Task<IActionResult> InvokeFunction(string library, string functionID, dynamic fxRequest)
{
if (_epiUtils.ValidSession(_epiUtils.sessionID, _licenseType, _path, _user, _apiKey, out string msg))
{
var restClient = new RestClient(_fxPath)
{
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
var request = new RestRequest($"{library}/{functionID}", Method.POST);
//add any optional request parameters
request.AddParameter("application/json", fxRequest, ParameterType.RequestBody);
//Web Service License
var headerLicense = new
{
ClaimedLicense = _licenseType,
SessionID = _epiUtils.sessionID
};
var header = JsonConvert.SerializeObject(headerLicense);
request.AddHeader("License", header);
request.AddHeader("Authorization", $"Basic {EpiUtils.Base64Encode(_user)}");
request.AddHeader("x-api-key", _apiKey);
IRestResponse response = await restClient.ExecuteAsync(request);
switch (response.StatusCode)
{
case System.Net.HttpStatusCode.BadRequest:
{
dynamic content = JsonConvert.DeserializeObject(response.Content);
var value = content;
return BadRequest(content);
}
case System.Net.HttpStatusCode.OK:
default:
{
dynamic content = JsonConvert.DeserializeObject(response.Content);
var value = content;
return Ok(content);
}
}
}
else
{
return Unauthorized(msg);
}
}
In my first example, I am using a HttpWebRequest because Epicor doesn’t ship with RestSharp available out of the box in the server assemblies (
), so I’m forced to use ancient tech to accomplish that. However, it is possible, just don’t have a great example:
C# JSON Post using HttpWebRequest - Stack Overflow
For your parameters, I don’t believe in doing hard-coded serialization like some people do but an easy way to accomplish that is to add your parameters to a Dictionary and serialize the whole thing into JSON :
//add custom field values to this dictionary
var customFields = new Dictionary<string,string>;
{
{"Physician","Dr. Test"}
,{"Patient", "Test Patient"}
,{"Graft Requested", "Femoral Core, 10mm"}
,{"Graft Offered", "Femoral Core, 10mm"}
,{"Graft ID", "123456-999"}
,{"Release Date", "10/18/2018"}
,{"Expire Date", "10/30/2018"}
,{"Patient Size Msg", "TW=N/A, W=N/A, L=N/A (bunch of text here)"}
,{"Donor Size Msg", "TW=N/A, W=N/A, L=N/A (bunch of text here)"}
,{"QuoteDtl Comment", "Please see dissection sheet for specific sizing"}
,{"ASC", "Aaron Moreng"}
,{"Offer Date", "10/18/2018"}
};
Or if you like even less code, you can just use an anonymous type to build your body and serialize it:
var taskHead = new
{
planId = bucket.PlanID,
bucketId = bucket.BucketID,
title = "New Task from Teams Bridge"
};
var content = JsonConvert.SerializeObject(taskHead);
Because you won’t have the ability to create a model for your response, I’d also recommend using the dynamic type when reading your response, especially if you are accessing nested data within it.
RE: Nested json; you’ll be able to do this with ease using anonymous types. That’s definitely what I’d recommend for this.
Anonymous Types | Microsoft Docs