Annotations
MIDL extends Haxe language with some annotations.
@:structuralFailure
@:structuralFailure
can be put in front of a MIDL interface.
It specifies what format of data the service will return
when the server produces 4xx or 5xx HTTP status.
For example:
@:structuralFailure(package.FileName.TypeName)
interface IMyService {
// Put your endpoint definitions here...
}
This annotation affect client-side SDKs's behavior of parsing response.
Client-side SDKs will parse the response content as a JSON with a schema defined in package.FileName.TypeName
,
when the server produces 4xx or 5xx HTTP status.
@:nativeGen
@:nativeGen
can be put in front of a MIDL interface or a MIDL class.
It annotates that the MIDL interface should be compiled to a native interface of target platforms.
@:nativeGen
interface IMyService {
// Put your endpoint definitions here...
}
@:nativeGen
prevents Haxe compiler generating helper methods for Haxe refactor API on the service.
You'd better always specify @:nativeGen
for interfaces unless you want to use Haxe refactor API.
@:route
@:route
must be put in front of a MIDL method.
It specifies the HTTP method and URI corresponding to this method.
@:nativeGen
interface IMyService {
@:route("GET", "users/{userId}")
function getProfile(userId:String):Future<Profile>;
}
The first parameter is the HTTP method, e.g. GET, POST, PUT, HEAD...
The second parameter is the URI template.
Variables in {...}
will be replaced to parameters of the MIDL method.
The specification of URI template can be found at RFC6570.
Right now, Microbuilder support level 1 features of URI template.
@:requestContentType
@:requestContentType
can be put in front of a MIDL method.
It specifies what Content-Type
HTTP header that the client will send to the server.
@:nativeGen
interface IMyService {
@:requestContentType("text/json")
@:route("PUT", "users/{userId}")
function setProfile(userId:String, contentBody:Profile):Future<Void>;
}
You must not set this annotation for a GET or HEAD method, while you must always set this annotation for a POST or PUT method.
Note that the last parameter will become request content body if you specifies a @:requestContentType
.
@:responseContentType
@:responseContentType
can be put in front of a MIDL method.
It specifies what Content-Type
HTTP header that the server will send to the client.
@:nativeGen
interface IMyService {
@:responseContentType("text/json")
@:route("PUT", "users/{userId}")
function getProfile(userId:String):Future<Profile>;
}
@:requestHeader
@:requestHeader
can be put in front of a MIDL method.
It adds custom headers into request.
@:nativeGen
interface IMyService {
@:requestHeader("Custom-Request-Header", "custom-header-value")
@:requestHeader("Session-Id", sessionId)
@:requestContentType("text/json")
@:route("PUT", "users/{userId}")
function setProfile(userId:String, sessionId:String, contentBody:Profile):Future<Void>;
}
You can specify a string literal for a fixed header value, like @:requestHeader("Custom-Request-Header", "custom-header-value")
.
However, sometimes you want to map a parameter to a header value, like @:requestHeader("Session-Id", sessionId)
.
@:final
@:final
can be put in front of a MIDL class.
It prevent the class being extened and will affect the behavior of mapping between JSON and class instance.
See Custom class types section for more information.
@:transient
@:transient
can be put in front of a field of MIDL class.
The @:transient
field will be ignored when mapping to JSON.
For example, given a definition for MyData
@:final
class MyData {
public function new() {}
public var notTransientField:Int = 1;
@:transient public var transientField:Int = 2;
}
Then, create a MyData
with default intial filed values: new MyData()
.
It will become { "notTransientField": 1 }
when converting to JSON format.
transientField
will not be present in the JSON because of the @:transient
.
@:jsonFieldName
@:jsonFieldName
can be put in front of a field of MIDL class.
It specifies the key for the field when converting from/to JSON.
For example, given a definition for MyData
@:final
class MyData {
public function new() {}
@:jsonFieldName("my-field") public var myField:Int = 1;
}
Then, create a MyData
with default intial filed values: new MyData()
.
It will become { "my-field": 1 }
when converting to JSON format.