universal request method for iOS

This commit is contained in:
Vladimir Enchev
2014-04-17 16:45:40 +03:00
parent 95916c52f8
commit 24e817916e
2 changed files with 85 additions and 42 deletions

20
net/http_client.d.ts vendored
View File

@ -8,4 +8,24 @@ export declare class http {
static getString(url: string): promises.Promise<string>; static getString(url: string): promises.Promise<string>;
static getJSON<T>(url: string): promises.Promise<T>; static getJSON<T>(url: string): promises.Promise<T>;
static getImage(url: string): promises.Promise<image_module.Image>; static getImage(url: string): promises.Promise<image_module.Image>;
static request(options: IHttpRequestOptions, successCallback: (r: IHttpResponse) => void, errorCallback?: (e: Error) => void);
}
export interface IHttpRequestOptions {
url: string;
method: string;
headers?: IHttpHeader[];
body?: string;
}
export interface IHttpHeader {
name: string;
value: string;
}
export interface IHttpResponse {
statusCode: number;
headers: IHttpHeader[];
body: any;
} }

View File

@ -1,7 +1,7 @@
/** /**
* iOS specific http client implementation. * iOS specific http client implementation.
*/ */
import http_client = require("net/http_client");
import image_module = require("Image/image"); import image_module = require("Image/image");
import promises = require("promises/promises"); import promises = require("promises/promises");
@ -11,7 +11,11 @@ export class http {
*/ */
public static getString(url: string): promises.Promise<string> { public static getString(url: string): promises.Promise<string> {
var d = promises.defer<string>(); var d = promises.defer<string>();
http.get(url, r => d.resolve(Foundation.NSString.initWithDataEncoding(r, 4).toString()), e => d.reject(e));
http.request({ url: url, method: "GET" },
r => d.resolve(Foundation.NSString.initWithDataEncoding(r.body, 4).toString()),
e => d.reject(e));
return d.promise(); return d.promise();
} }
@ -20,7 +24,11 @@ export class http {
*/ */
public static getJSON<T>(url: string): promises.Promise<T> { public static getJSON<T>(url: string): promises.Promise<T> {
var d = promises.defer<T>(); var d = promises.defer<T>();
http.get(url, r => d.resolve(JSON.parse(Foundation.NSString.initWithDataEncoding(r, 4).toString())), e => d.reject(e));
http.request({ url: url, method: "GET" },
r => d.resolve(JSON.parse(Foundation.NSString.initWithDataEncoding(r.body, 4).toString())),
e => d.reject(e));
return d.promise(); return d.promise();
} }
@ -29,57 +37,71 @@ export class http {
*/ */
public static getImage(url: string): promises.Promise<image_module.Image> { public static getImage(url: string): promises.Promise<image_module.Image> {
var d = promises.defer<image_module.Image>(); var d = promises.defer<image_module.Image>();
http.get(url, r => {
var image = new image_module.Image(); http.request({ url: url, method: "GET" },
image.loadFromData(r); r => {
d.resolve(image); var image = new image_module.Image();
}, e => d.reject(e)); image.loadFromData(r.body);
d.resolve(image);
},
e => d.reject(e));
return d.promise(); return d.promise();
} }
private static get(url: string, successCallback: (result: any) => void, errorCallback?: (e: Error) => void) { private static request(options: http_client.IHttpRequestOptions,
successCallback: (r: http_client.IHttpResponse) => void,
errorCallback?: (e: Error) => void) {
try { try {
var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration(); var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration();
var queue = Foundation.NSOperationQueue.mainQueue(); var queue = Foundation.NSOperationQueue.mainQueue();
var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(sessionConfig, null, queue); var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
var dataTask = session.dataTaskWithURLCompletionHandler(Foundation.NSURL.URLWithString(url), function (data, response, error) { sessionConfig, null, queue);
if (error) {
if (errorCallback) {
errorCallback(new Error(error.localizedDescription()));
}
} else if (successCallback) {
successCallback(data);
}
});
dataTask.resume(); var urlRequest = Foundation.NSMutableURLRequest.requestWithURL(
session.finishTasksAndInvalidate(); Foundation.NSURL.URLWithString(options.url));
} catch (ex) {
if (errorCallback) { urlRequest.setHTTPMethod(options.method);
errorCallback(ex);
if (options.headers && options.headers.length) {
for (var i = 0, l = options.headers.length; i < l; i++) {
var header = options.headers[i];
urlRequest.setValueForHTTPHeaderField(header.name, header.value);
}
} }
}
}
private static post(url: string, postData: string, successCallback?: (result: any) => void, errorCallback?: (e: Error) => void) { if (typeof (options.body) == "string") {
try { urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.body).dataUsingEncoding(4));
var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration(); }
var queue = Foundation.NSOperationQueue.mainQueue();
var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(sessionConfig, null, queue);
var urlRequest = Foundation.NSMutableURLRequest.requestWithURL(Foundation.NSURL.URLWithString(url)); var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
urlRequest.setHTTPMethod("POST"); function (data, response, error) {
urlRequest.setHTTPBody(Foundation.NSString.initWithString(postData).dataUsingEncoding(4)); if (error) {
if (errorCallback) {
errorCallback(new Error(error.localizedDescription()));
}
} else if (successCallback) {
var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest, function (data, response, error) { var headers = new Array<http_client.IHttpHeader>();
if (error) { var headerFields = response.allHeaderFields();
if (errorCallback) { var keys = headerFields.allKeys();
errorCallback(new Error(error.localizedDescription()));
for (var i = 0, l = keys.count(); i < l; i++) {
var key = keys.objectAtIndex(i);
headers.push({ name: key, value: headerFields.valueForKey(key) });
}
successCallback(
{
body: data,
statusCode: response.statusCode,
headers: headers
});
} }
} else if (successCallback) { });
successCallback(data);
}
});
dataTask.resume(); dataTask.resume();
} catch (ex) { } catch (ex) {
@ -87,5 +109,6 @@ export class http {
errorCallback(ex); errorCallback(ex);
} }
} }
} }
} }