mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-17 21:01:34 +08:00
http client reworked (temporary getString, getJSON and getImage in separate file)
This commit is contained in:
@ -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>
|
||||||
|
23
declarations.android.d.ts
vendored
23
declarations.android.d.ts
vendored
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
30
net/http_client.d.ts
vendored
@ -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;
|
||||||
}
|
}
|
@ -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
42
net/http_common.ts
Normal 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();
|
||||||
|
}
|
Reference in New Issue
Block a user