123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import { Injectable } from "@angular/core";
- import { Http, Response, Headers, RequestOptions } from "@angular/http";
- import { Observable } from "rxjs";
- import 'rxjs/add/operator/map';
- import 'rxjs/add/operator/catch';
- import 'rxjs/add/observable/throw'
- import { XmlRpcHelper } from "./xmlrpc-helper";
- import { JsToXml } from "./js-to-xml";
- import { Xml2Js } from "./xml-to-js";
- @Injectable()
- export class XmlRpc {
- configuration: {
- host: string,
- pathName: string
- }
- constructor(
- private http: Http,
- private helper: XmlRpcHelper,
- private jsToXml: JsToXml,
- private xmlToJs: Xml2Js
- ) {
- }
- /**
- *
- */
- serialize(xml: any): any {
- let text = xml.xml;
- if (text) {
- return text;
- }
- if (typeof XMLSerializer != undefined) {
- return new XMLSerializer().serializeToString(xml);
- }
- throw new Error('Your browser does not support serializing XML documents');
- }
- /**
- *
- */
- createCall(method: any, params: any): any {
- var doc = this.helper.createDocument('methodCall');
- doc.firstChild.appendChild(this.helper.createNode(doc, 'methodName', method));
- if (arguments.length > 2) {
- params = this.helper.cloneArray(arguments);
- params.shift();
- }
- if (params && params.length > 0) {
- let paramsNode = this.helper.createNode(doc, params);
- for (let i = 0; i < params.length; i++) {
- paramsNode.appendChild(this.helper.createNode(doc, 'param', this.jsToXml.jsToXml(doc, params[i])));
- }
- doc.firstChild.appendChild(paramsNode);
- }
- return (this.serialize(doc)).replace(/[\s\xa0]+$/, '');
- }
- /**
- *
- */
- callMethod(method: any, params: any): Observable<any> {
- let xmlStr = this.createCall(method, params);
- let targetUrl = this.configuration.host + "" + this.configuration.pathName;
- let headers = new Headers({ 'Content-Type': 'text/xml' });
- let options = new RequestOptions({ headers: headers });
- return this.http.post(targetUrl, xmlStr, options).map(this.extractData);
- }
- /**
- *
- */
- private extractData(response: Response): any {
- console.log(response);
- return response;
- }
- /**
- *
- */
- private handleError(error: any): any {
- return Observable.throw(error);
- }
- /**
- *
- */
- parseResponse(response: any): any {
- let doc = this.helper.loadXml(response);
- let rootNode = doc.firstChild;
- if (!rootNode) {
- return undefined;
- }
- var node = this.helper.selectSingleNode(rootNode, "//fault");
- let isFault = (node != undefined);
- node = this.helper.selectSingleNode(rootNode, '//value');
- var value = this.xmlToJs.xmlToJs(node);
- if (isFault) {
- throw value;
- }
- return value;
- }
- /**
- *
- */
- configure(hostName: string, pathName: string): void {
- this.configuration.host = hostName;
- this.configuration.pathName = pathName;
- }
- }
|