Generating links
Saule lets you customize the links that are generated during serialization. It
uses the IUrlPathBuilder
interface to generate all urls.
There are two complementary methods to control the link generation.
Resource and relationship configuration
By using the enumeration LinkType
you can opt out of link generation for a
specific ApiResource
or Relationship
by setting it as in the following examples:
In your ApiResource
constructor:
WithLinks(LinkType.None);
When defining a Relationship
:
BelongsTo<OtherResource>(nameof(Model.Other), "/other", LinkType.None);
You can also use LinkType.Self
or LinkType.Related
to keep only these types of links
where relevant.
UrlPathBuilder customization
You can provide an implementation of the IUrlPathBuilder
interface to the
ConfigureJsonApi
extension method on HttpConfiguration
:
config.ConfigureJsonApi(new JsonApiConfiguration {
UrlPathBuilder = new DefaultUrlPathBuilder()
});
If you want to add a prefix to all urls, you can do so in the constructor:
var prefixedUrls = new DefaultUrlPathBuilder("/api");
Saule comes with two implementations of IUrlPathBuilder
:
Link type | DefaultUrlPathBuilder |
CanonicalUrlPathBuilder |
---|---|---|
Collection of resources | /people/ |
/people/ |
Individual resource | /people/123/ |
/people/123/ |
Related resource | /people/123/employer/ |
/companies/456/ |
Related resource’s self link | /people/123/relationships/employer/ |
/people/123/relationships/employer/ |
If you want to customize generated links beyond this, you can do so by extending
one of the above implementations or by implementing the interface from scratch.
The IUrlPathBuilder
interface consists of four methods, which correspond to the
link types in the table above:
public interface IUrlPathBuilder
{
// collection of resources
string BuildCanonicalPath(ApiResource resource);
// individual resource
string BuildCanonicalPath(ApiResource resource, string id);
// related resource
string BuildRelationshipPath(ApiResource resource, string id, ResourceRelationship relationship);
// related resource self link
string BuildRelationshipPath(ApiResource resource, string id, ResourceRelationship relationship, string relatedResourceId);
}
The included implementations use these methods internally as well; if you override
BuildCanonicalPath(ApiResource)
, it will affect the result of all other methods.