You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.6 KiB
115 lines
2.6 KiB
package utils;
|
|
|
|
import haxe.Json;
|
|
import js.Promise;
|
|
import js.html.XMLHttpRequest;
|
|
|
|
@:enum abstract HttpMethod(String) to String {
|
|
var POST = 'POST';
|
|
var GET = 'GET';
|
|
var HEAD = 'HEAD';
|
|
var PUT = 'PUT';
|
|
var DELETE = 'DELETE';
|
|
var TRACE = 'TRACE';
|
|
var OPTIONS = 'OPTIONS';
|
|
var CONNECT = 'CONNECT';
|
|
var PATCH = 'GET';
|
|
}
|
|
|
|
@:enum abstract FetchFormat(String) from String to String {
|
|
var PLAIN_TEXT = "text/plain";
|
|
var JSON = "application/json";
|
|
}
|
|
|
|
//json version of a tink.core.Error
|
|
typedef ErrorInfos = {error:{code:Int,message:String,stack:String}}
|
|
|
|
/**
|
|
* Manage HTTP request to a REST API.
|
|
*
|
|
* POST requests can only have a single JSON object (payload)
|
|
*/
|
|
class HttpUtil
|
|
{
|
|
static public function fetch(
|
|
url: String,
|
|
?method: HttpMethod = GET,
|
|
?params: Dynamic = null,
|
|
?accept: FetchFormat = PLAIN_TEXT,
|
|
?contentType: String = JSON
|
|
): Promise<Dynamic> {
|
|
|
|
return new Promise(function(resolve: Dynamic->Void, reject) {
|
|
var data: String = null;
|
|
if (params != null)
|
|
{
|
|
if (params.body != null){
|
|
data = Json.stringify(params.body);
|
|
} else if(method==POST) {
|
|
data = Json.stringify(params);
|
|
} else {
|
|
url += (url.indexOf('?') > -1) ? '&' : '?';
|
|
url += objToString(params);
|
|
}
|
|
}
|
|
|
|
var http = new XMLHttpRequest();
|
|
http.open(method, url, true);
|
|
|
|
if (contentType != null && contentType.length > 0)
|
|
http.setRequestHeader("Content-type", contentType);
|
|
|
|
if (accept != null)
|
|
http.setRequestHeader("Accept", accept);
|
|
|
|
http.onreadystatechange = function() {
|
|
//trace("readystate",http.readyState, http.status);
|
|
if (http.readyState == 4){
|
|
switch (http.status){
|
|
case 200:
|
|
switch (accept){
|
|
case JSON:
|
|
try {
|
|
var json = Json.parse(http.responseText);
|
|
resolve(json);
|
|
} catch (err: Dynamic){
|
|
reject(err);
|
|
}
|
|
default:
|
|
resolve(http.responseText);
|
|
}
|
|
|
|
case 204:
|
|
resolve(true);
|
|
|
|
default:
|
|
reject(http.responseText);
|
|
}
|
|
}
|
|
};
|
|
|
|
http.send(data);
|
|
});
|
|
}
|
|
|
|
static public function objToString(obj: Dynamic): String
|
|
{
|
|
var str = "";
|
|
var cpt = 0;
|
|
for (key in Reflect.fields(obj))
|
|
{
|
|
var value: Dynamic = Reflect.field(obj, key);
|
|
if (value == null) continue;
|
|
|
|
if (cpt++ > 0)
|
|
str += "&";
|
|
|
|
if (Std.is(value, Array) && value.length > 0)
|
|
str += '$key=${value.join(";")}';
|
|
else if (Std.string(value) != "") // String / Int / Float
|
|
str += '$key=${StringTools.trim(Std.string(value))}';
|
|
}
|
|
return str;
|
|
}
|
|
|
|
}
|