http client reworked (temporary getString, getJSON and getImage in separate file)

This commit is contained in:
Vladimir Enchev
2014-04-23 17:00:38 +03:00
parent 24e817916e
commit 1bf9c1ecaa
6 changed files with 192 additions and 163 deletions

View File

@ -148,6 +148,7 @@
<TypeScriptCompile Include="android17.d.ts" /> <TypeScriptCompile Include="android17.d.ts" />
<TypeScriptCompile Include="promises\promises.ts" /> <TypeScriptCompile Include="promises\promises.ts" />
<TypeScriptCompile Include="promises\index.ts" /> <TypeScriptCompile Include="promises\index.ts" />
<TypeScriptCompile Include="net\http_common.ts" />
<Content Include="_references.ts" /> <Content Include="_references.ts" />
<TypeScriptCompile Include="Console\console.android.ts"> <TypeScriptCompile Include="Console\console.android.ts">
<DependentUpon>console.d.ts</DependentUpon> <DependentUpon>console.d.ts</DependentUpon>

View File

@ -346,7 +346,8 @@ declare module com {
export module ion { export module ion {
export class Ion { export class Ion {
static with(context: any, url : string) : any; static with(context: any, url: string): any;
static getDefault(context: any): any;
} }
} }
@ -356,6 +357,26 @@ declare module com {
constructor(context: any); constructor(context: any);
} }
} }
export module http {
export module libcore {
export class RawHeaders {
constructor();
add(name: string, v: string);
}
}
export class AsyncHttpClient {
static getDefaultInstance(): any;
}
export module callback {
export class HttpConnectCallback {
constructor(params: any);
}
}
}
} }
} }
} }

View File

@ -1,66 +1,61 @@
/** /**
* Android specific http client implementation. * Android specific http client implementation.
*/ */
import image_module = require("Image/image"); import image_module = require("Image/image");
import app_module = require("Application/application"); import app_module = require("Application/application");
import promises = require("promises/promises"); import promises = require("promises/promises");
export class http { import http = require("net/http_client");
/**
* Gets string from url.
*/
public static getString(url: string): promises.Promise<string> {
var d = promises.defer<string>();
http.get(url, r => d.resolve(r), e => d.reject(e));
return d.promise();
}
/** /*
* Gets JSON from url. // merge common
*/ import http_common = require("net/http_common");
public static getJSON<T>(url: string): promises.Promise<T> { declare var exports;
var d = promises.defer<T>(); exports.getString = http_common.getString;
http.get(url, r => d.resolve(JSON.parse(r)), e => d.reject(e)); exports.getJSON = http_common.getJSON;
return d.promise(); exports.getImage = http_common.getImage;
} */
/** // TODO: Replace with similar to iOS implementation!
* Gets image from url. export function request(options: http.HttpRequestOptions): promises.Promise<http.HttpResponse> {
*/ var d = promises.defer<http.HttpResponse>();
public static getImage(url: string): promises.Promise<image_module.Image> {
var d = promises.defer<image_module.Image>();
http.get(url, r => {
var image = new image_module.Image();
image.loadFromNativeBitmap(r);
d.resolve(image);
}, e => d.reject(e));
return d.promise();
}
// TODO: Accept: application/json header for JSON calls and check the response for Image not url! try {
private static get(url: string, successCallback: (result: any) => void, errorCallback?: (e: Error) => void) { var headers = new com.koushikdutta.async.http.libcore.RawHeaders();
try {
var isImage = url.match(/\.(jpeg|jpg|gif|png)$/i) != null;
var context = app_module.Application.current.android.context; if (options.headers && options.headers.length) {
var request = com.koushikdutta.ion.Ion.with(context, url); for (var i = 0, l = options.headers.length; i < l; i++) {
var header = options.headers[i];
request = isImage ? request.asBitmap() : request.asString(); headers.add(header.name, header.value)
request.setCallback(new com.koushikdutta.async.future.FutureCallback({
onCompleted: function (error, data) {
if (error && errorCallback) {
errorCallback(new Error(error.toString()));
} else if (successCallback) {
successCallback(data);
}
} }
}));
} catch (ex) {
if (errorCallback) {
errorCallback(ex);
}
} }
var isImage = options.url.match(/\.(jpeg|jpg|gif|png)$/i) != null;
var context = app_module.Application.current.android.context;
var request = com.koushikdutta.ion.Ion.with(context, options.url);
request = isImage ? request.asBitmap() : request.asString();
request.setCallback(new com.koushikdutta.async.future.FutureCallback({
onCompleted: function (error, data) {
if (error) {
d.reject(error);
} else {
d.resolve({
body: {
toString: () => { return data },
toJSON: () => { return JSON.parse(data) },
toImage: () => { return image_module.Image.imageFromNativeBitmap(data); }
},
statusCode: 0,
headers: []
});
}
}
}));
} catch (ex) {
d.reject(ex);
} }
return d.promise();
} }

30
net/http_client.d.ts vendored
View File

@ -4,28 +4,32 @@
import image_module = require("Image/image"); import image_module = require("Image/image");
import promises = require("promises/promises"); import promises = require("promises/promises");
export declare class http { export declare function getString(url: string): promises.Promise<string>;
static getString(url: string): promises.Promise<string>; export declare function getJSON<T>(url: string): promises.Promise<T>;
static getJSON<T>(url: string): promises.Promise<T>; export declare function 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 declare function request(options: HttpRequestOptions): promises.Promise<HttpResponse>;
}
export interface IHttpRequestOptions { export interface HttpRequestOptions {
url: string; url: string;
method: string; method: string;
headers?: IHttpHeader[]; headers?: HttpHeader[];
body?: string; body?: any;
} }
export interface IHttpHeader { export interface HttpHeader {
name: string; name: string;
value: string; value: string;
} }
export interface IHttpResponse { export interface HttpResponse {
statusCode: number; statusCode: number;
headers: IHttpHeader[]; headers: HttpHeader[];
body: any; body: HttpContent;
}
export interface HttpContent {
toString: () => string;
toJSON: () => any;
toImage: () => image_module.Image;
} }

View File

@ -1,114 +1,80 @@
/** /**
* iOS specific http client implementation. * iOS specific http client implementation.
*/ */
import http_client = require("net/http_client"); import image = require("Image/image");
import image_module = require("Image/image");
import promises = require("promises/promises"); import promises = require("promises/promises");
import http = require("net/http_client");
export class http { /*
/** // merge common
* Gets string from url. import http_common = require("net/http_common");
*/ declare var exports;
public static getString(url: string): promises.Promise<string> { exports.getString = http_common.getString;
var d = promises.defer<string>(); exports.getJSON = http_common.getJSON;
exports.getImage = http_common.getImage;
*/
http.request({ url: url, method: "GET" }, export function request(options: http.HttpRequestOptions): promises.Promise<http.HttpResponse> {
r => d.resolve(Foundation.NSString.initWithDataEncoding(r.body, 4).toString()), var d = promises.defer<http.HttpResponse>();
e => d.reject(e));
return d.promise(); try {
} var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration();
var queue = Foundation.NSOperationQueue.mainQueue();
var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
sessionConfig, null, queue);
/** var urlRequest = Foundation.NSMutableURLRequest.requestWithURL(
* Gets JSON from url. Foundation.NSURL.URLWithString(options.url));
*/
public static getJSON<T>(url: string): promises.Promise<T> {
var d = promises.defer<T>();
http.request({ url: url, method: "GET" }, urlRequest.setHTTPMethod(options.method);
r => d.resolve(JSON.parse(Foundation.NSString.initWithDataEncoding(r.body, 4).toString())),
e => d.reject(e));
return d.promise(); 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);
* Gets image from url.
*/
public static getImage(url: string): promises.Promise<image_module.Image> {
var d = promises.defer<image_module.Image>();
http.request({ url: url, method: "GET" },
r => {
var image = new image_module.Image();
image.loadFromData(r.body);
d.resolve(image);
},
e => d.reject(e));
return d.promise();
}
private static request(options: http_client.IHttpRequestOptions,
successCallback: (r: http_client.IHttpResponse) => void,
errorCallback?: (e: Error) => void) {
try {
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(options.url));
urlRequest.setHTTPMethod(options.method);
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);
}
}
if (typeof (options.body) == "string") {
urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.body).dataUsingEncoding(4));
}
var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
function (data, response, error) {
if (error) {
if (errorCallback) {
errorCallback(new Error(error.localizedDescription()));
}
} else if (successCallback) {
var headers = new Array<http_client.IHttpHeader>();
var headerFields = response.allHeaderFields();
var keys = headerFields.allKeys();
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
});
}
});
dataTask.resume();
} catch (ex) {
if (errorCallback) {
errorCallback(ex);
} }
} }
if (typeof (options.body) == "string") {
urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.body).dataUsingEncoding(4));
}
var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
function (data, response, error) {
if (error) {
d.reject(error);
} else {
var headers = new Array<http.HttpHeader>();
var headerFields = response.allHeaderFields();
var keys = headerFields.allKeys();
for (var i = 0, l = keys.count(); i < l; i++) {
var key = keys.objectAtIndex(i);
headers.push({ name: key, value: headerFields.valueForKey(key) });
}
d.resolve({
body: {
toString: () => { return NSDataToString(data); },
toJSON: () => { return JSON.parse(NSDataToString(data)); },
toImage: () => { return image.Image.imageFromData(data); }
},
statusCode: response.statusCode,
headers: headers
});
}
});
dataTask.resume();
} catch (ex) {
d.reject(ex);
} }
return d.promise();
}
function NSDataToString(data: any): string {
return Foundation.NSString.initWithDataEncoding(data, 4).toString();
} }

42
net/http_common.ts Normal file
View File

@ -0,0 +1,42 @@
import image_module = require("Image/image");
import promises = require("promises/promises");
import http = require("net/http_client");
/**
* Gets string from url.
*/
export function getString(url: string): promises.Promise<string> {
var d = promises.defer<string>();
http.request({ url: url, method: "GET" })
.then(r => d.resolve(r.body.toString()))
.fail(e => d.reject(e));
return d.promise();
}
/**
* Gets JSON from url.
*/
export function getJSON<T>(url: string): promises.Promise<T> {
var d = promises.defer<T>();
http.request({ url: url, method: "GET" })
.then(r => d.resolve(r.body.toJSON()))
.fail(e => d.reject(e));
return d.promise();
}
/**
* Gets image from url.
*/
export function getImage(url: string): promises.Promise<image_module.Image> {
var d = promises.defer<image_module.Image>();
http.request({ url: url, method: "GET" })
.then(r => d.resolve(r.body.toImage()))
.fail(e => d.reject(e));
return d.promise();
}