xmlrpc.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { Injectable } from "@angular/core";
  2. import { Http, Response, Headers, RequestOptions } from "@angular/http";
  3. import { Observable } from "rxjs";
  4. import 'rxjs/add/operator/map';
  5. import 'rxjs/add/operator/catch';
  6. import 'rxjs/add/observable/throw'
  7. import { XmlRpcHelper } from "./xmlrpc-helper";
  8. import { JsToXml } from "./js-to-xml";
  9. import { Xml2Js } from "./xml-to-js";
  10. @Injectable()
  11. export class XmlRpc {
  12. configuration: {
  13. host: string,
  14. pathName: string
  15. }
  16. constructor(
  17. private http: Http,
  18. private helper: XmlRpcHelper,
  19. private jsToXml: JsToXml,
  20. private xmlToJs: Xml2Js
  21. ) {
  22. }
  23. /**
  24. *
  25. */
  26. serialize(xml: any): any {
  27. let text = xml.xml;
  28. if (text) {
  29. return text;
  30. }
  31. if (typeof XMLSerializer != undefined) {
  32. return new XMLSerializer().serializeToString(xml);
  33. }
  34. throw new Error('Your browser does not support serializing XML documents');
  35. }
  36. /**
  37. *
  38. */
  39. createCall(method: any, params: any): any {
  40. var doc = this.helper.createDocument('methodCall');
  41. doc.firstChild.appendChild(this.helper.createNode(doc, 'methodName', method));
  42. if (arguments.length > 2) {
  43. params = this.helper.cloneArray(arguments);
  44. params.shift();
  45. }
  46. if (params && params.length > 0) {
  47. let paramsNode = this.helper.createNode(doc, params);
  48. for (let i = 0; i < params.length; i++) {
  49. paramsNode.appendChild(this.helper.createNode(doc, 'param', this.jsToXml.jsToXml(doc, params[i])));
  50. }
  51. doc.firstChild.appendChild(paramsNode);
  52. }
  53. return (this.serialize(doc)).replace(/[\s\xa0]+$/, '');
  54. }
  55. /**
  56. *
  57. */
  58. callMethod(method: any, params: any): Observable<any> {
  59. let xmlStr = this.createCall(method, params);
  60. let targetUrl = this.configuration.host + "" + this.configuration.pathName;
  61. let headers = new Headers({ 'Content-Type': 'text/xml' });
  62. let options = new RequestOptions({ headers: headers });
  63. return this.http.post(targetUrl, xmlStr, options).map(this.extractData);
  64. }
  65. /**
  66. *
  67. */
  68. private extractData(response: Response): any {
  69. console.log(response);
  70. return response;
  71. }
  72. /**
  73. *
  74. */
  75. private handleError(error: any): any {
  76. return Observable.throw(error);
  77. }
  78. /**
  79. *
  80. */
  81. parseResponse(response: any): any {
  82. let doc = this.helper.loadXml(response);
  83. let rootNode = doc.firstChild;
  84. if (!rootNode) {
  85. return undefined;
  86. }
  87. var node = this.helper.selectSingleNode(rootNode, "//fault");
  88. let isFault = (node != undefined);
  89. node = this.helper.selectSingleNode(rootNode, '//value');
  90. var value = this.xmlToJs.xmlToJs(node);
  91. if (isFault) {
  92. throw value;
  93. }
  94. return value;
  95. }
  96. /**
  97. *
  98. */
  99. configure(hostName: string, pathName: string): void {
  100. this.configuration.host = hostName;
  101. this.configuration.pathName = pathName;
  102. }
  103. }