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

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;
}
}