I was having some trouble getting values from my home-brewed web API into an InfoPath Designer 2013 form, so I wanted to document the solution for those of you out there perhaps struggling with this as well.
I was calling a simple 'Hello World
'-web API that would return a string
. My simple API looks like this:
namespace ADlookup.Controllers
{
public class employee
{
public string employeeId { get; set; }
public string bossId { get; set; }
}
public class ADLookupController : ApiController
{
[HttpGet]
public employee getNearestBossId([FromUri] string id)
{
return new employee()
{
employeeId = id,
bossId = id
};
}
}
}
However, upon calling this API in InfoPath Designer 2013, I got the following error message:
... to indicate the XML structure is invalid.
I didn't get it - when I called the service directly from my browser, valid XML was returned!:
The problem, as it turned out, was of course the one that as opposed to the XML displayed by my browsers, the InfoPath Designer application - correctly - retrieved the data by way of json, the web APIs default MO.
So, in order to serve up only XML, for InfoPath to agree with, we'll strip away the web API's possibility of serving up json altogether. Modify your WebApiConfig
to resemble the below, though of course take into consideration the routes you have for your own app:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var formatters = GlobalConfiguration.Configuration.Formatters;
formatters.Remove(formatters.JsonFormatter);
}
}
Now, as we re-publish the web API service, we can try once more the URL in InfoPath, which will now allow us to proceed to the next step:
Intriguingly, on a completely different note, the 'get data from http rest service' workflow component in Sharepoint Designer 2013 works off JSON, as opposed to XML! But that's a blog-entry for another rainy day.
Hope this helps someone, anyone.
Thanks for reading.