Geocoder WebService Client -- java campo con object-oriented campo con web-services camp codereview Relacionados El problema

Geocoder Webservice client


1
vote

problema

Español

He estado escribiendo / arreglando el código de Java, pero solo entrando en diseño de objetos / arquitectura. Estoy escribiendo un cliente de WebService en Java para integrar un servicio web de geocodificación de validación de direcciones comerciales en nuestra solicitud. El nuestro es un software de impuestos escrito en PowerBuilder funcionando dentro de Easerver. Estoy escribiendo el cliente de servicio web en Java, por lo que se puede integrar con el cliente PB a través de CORBA.

He hecho un servicio similar antes para obtener una información de GIS y este fue un diseño ligeramente más simple que maneja solo XML para solicitud y respuesta. Me encargué y envié solicitud y respuesta en el propio controlador.

Comencé a usar el mismo diseño y presionar un bloque de carretera: el servicio web actual maneja tanto XML como de descanso (a través de la URL de HTTP); En realidad, hay 2 URL de servicio web, el para la validación de la dirección / la geocodificación es compatible con XML o REST, y la otra para las direcciones de búsqueda utiliza solo el descanso. Quiero diseñar una solicitud genérica. Clase / interfaz abstracta y el controlador que se puede usar tanto para los servicios. Mientras intentaba llegar a las clases, me encontraba con un problema de diseño clásico. Ahora, con la solicitud en sí misma puede ser una cadena XML o un objeto URI (para la solicitud de descanso), mi enfoque de obtener la solicitud y enviarla en el controlador parece falso.

¿Debo hacer que el objeto de solicitud en sí construya y envíe XML / descanse al servicio externo o si debería administrar de alguna manera obtener diferentes tipos de solicitudes en el controlador y enviarlo desde allí (usando getRequest y sendRequest )?

También, estoy aprendiendo a usar patrones de diseño en Java. ¿Qué tipo de patrón de diseño sería aplicable aquí? Vi el patrón de comando sugerido para un cliente similar. Además, ¿se puede aplicar aquí el patrón MVC?

El método marcado como 3. Es la carne del controlador del cliente: obtiene el objeto 998877766555443339 , envía la consulta después de obtener el XML desde el objeto RotatingText0 y finalmente analiza el objeto RotatingText1 Volvió a enviar los datos a la aplicación heredada en PB.

  RotatingText2  

MI RotatingText3 La clase se parece a esto (de nuevo, todos los comentarios y otras cosas):

Puede haber más de una capa enviada en RotatingText4 , así que tengo:

  RotatingText5  

En la Super Clase, RotatingText6 . La capa contiene matrices de RotatingText7 y RotatingText8 .

  RotatingText9  

Nota: Mi código tiene que estar en Java 1.4 debido al FEEERVER LEGACY.

Geocoder WebService Client

Original en ingles

I have been writing/fixing Java code, but just getting into object design/architecture. I am writing a webservice client in Java to integrate a commercial Address Validation Geocoding Webservice into our application. Ours is a Tax software written in PowerBuilder running inside EAServer. I am writing the web service client in Java, so it can be integrated with the PB client through CORBA.

I have done a similar service earlier to get some GIS information and this was slightly simpler design handling only XML for both Request and Response. I handled getting/sending request and response in the controller itself.

I started using the same design and hit a road block: current web service handles both XML and REST (through HTTP GET URL); actually, there are 2 webservice URLs, the one for Address Validation/Geocoding supports XML or REST, and the other for searching addresses uses REST only. I want to design a generic request abstract class/interface and the controller that can be used for both the services. While trying to come up with the classes, I ran into a classic design issue. Now with Request itself can be a XML string or a URI object (for REST Request), my approach of getting the request and sending it in Controller seems flawed.

Should I make the Request object itself build and send XML/REST itself to the external Service or should I somehow manage to get different types of Requests into the Controller and send it from there (using getRequest and sendRequest)?

Also, I am learning to use Design Patterns in Java. What type of design pattern would be applicable here? I saw command pattern suggested for a similar client. Also, can MVC pattern be applied here?

The method marked as 3. is the meat of the client controller - it gets the Request object, sends the query after getting the XML from the Request object and finally parses the Response object returned to send the data back to the Legacy application in PB.

public class BoeGeoQueryManager {     private void init(String aUrlStr) {      try {       URL endPoint = new URL(aUrlStr);       GeoQuery_MyLAService service = new GeoQuery_MyLAServiceLocator();       geoq = service.getGeoQuery_MyLAcfc(endPoint);     } catch (MalformedURLException me) {       logger.error("BOEGIS", "", this.toString() + " - " +  "init", "Error initializing. " + me.getMessage());       me.printStackTrace();     } catch (ServiceException se) {       logger.error("BOEGIS", "", this.toString() + " - " +  "init", "Error initializing Service. " + se.getMessage());       se.printStackTrace();     }   }    // Search by Address   public String queryBoeGis(String aAddress) throws Exception {     BoeXMLRequest lRequest = new BoeXMLRequest(aAddress, 0, 0, GISRequest.SEARCH_MODE_ADDRESS);      return queryBoeGis(lRequest);    }    // Search by Lat/Long   public String queryBoeGis(double aLatitude, double aLongitude) throws Exception {     BoeXMLRequest lRequest =         new BoeXMLRequest(GISRequest.REQUEST_BLANK_ADDRESS, aLatitude, aLongitude,             GISRequest.SEARCH_MODE_LATLONG);      return queryBoeGis(lRequest);    }    // 3. The controller is doing the Webservice call here. I just pass in    // the Request object into this. Controller is fully aware it's a XML   // Request/Response.   public String queryBoeGis(BoeXMLRequest aRequest) throws Exception {      String respXML = "";     String reqXML = "";      requestCount++;     try {       reqXML = aRequest.getXml();        if (aRequest.isModeLatLong()) {         respXML = geoq.qByCoords(reqXML);       } else if (aRequest.isModeAddress()) {         // search by address (or both)         respXML = geoq.addressValidationService(reqXML);       }       respXML = XMLDocument.cleanup(respXML);       BoeXMLResponse boeResponse = new BoeXMLResponse(respXML);        // To be able to get a flattened XML to be sent to the Legacy application       if (adjustXML)         respXML = XMLExtractor.getAdjXml(aRequest, boeResponse);      } catch (Exception e) {       e.printStackTrace();       respXML = "";     }      // Otherwise, return the original XML     return respXML;   } } 

My Request class looks like this (again stripped all comments and other stuff):

There can be more than one layer sent in Request, so I have:

protected Layer[]          layers; 

in the super class, GISRequest. Layer contains arrays of fieldName and fieldValue.

public class BoeXMLRequest extends GISRequest {    private static final String XML_EMPTY         = "";   private final static String LAYERS_TAG        = PropsUtil.getString("BOEXML.LAYERS_TAG");   private final static String COLUMN_SUFFIX     = "." + PropsUtil.getString("BOEXML.COLUMN_TAG");   private final static String LAYER_NAME_SUFFIX = "." + PropsUtil.getString("BOEXML.LAYER_NAME_TAG");    public BoeXMLRequest(String aAddress, double aLatitude, double aLongitude, String aSearchMode) {      super(aAddress, aLatitude, aLongitude, aSearchMode);     loadLayers();     status = searchModeToStatus(aSearchMode);   }     public BoeXMLRequest(double aLatitude, double aLongitude) {     this(GISRequest.REQUEST_BLANK_ADDRESS, aLatitude, aLongitude, GISRequest.SEARCH_MODE_LATLONG);   }    public String getXml() {     String searchMode = getSearchMode();      if (searchMode.equals(GISRequest.SEARCH_MODE_ADDRESS)) {       return buildXml(address, "0|0", status);     } else if (searchMode.equals(GISRequest.SEARCH_MODE_LATLONG)) {       String latLong = String.valueOf(longitude) + "|" + String.valueOf(latitude);       return buildXml(address, latLong, status);     } else if (searchMode.equals(GISRequest.SEARCH_MODE_BOTH)) {       String latLong = String.valueOf(longitude) + "|" + String.valueOf(latitude);       return buildXml(address, latLong, status);      }     return XML_EMPTY;   }    protected String buildXml(String address, String latLong, String status) {     String xmlStr =         XMLDocument.wrapTag("qWhat", "addr_int") + XMLDocument.wrapTag("status", status)             + XMLDocument.wrapTag("coordinates", latLong)             + XMLDocument.wrapTag("address-geocode", address) + getLayerElement();     // wrap the above element in root "Address-Request" with XML header.     xmlStr = XMLDocument.wrapXml("Address-Request", xmlStr, true);     return xmlStr;   }    private String getLayerElement() {     String layerElement = "<layers>";      // for (Layer layer : this.getLayers()) {      for (int i = 0; i < this.layers.length; i++) {       Layer layer = this.layers[i];       layerElement += "<layer>";       layerElement += "<name>" + layer.getName() + "</name>";       layerElement += "<fields>";       // for (Field field : layer.getFields()) {       // for (String fieldName : layer.getFieldNames()) {       for (int j = 0; j < layer.getFieldNames().length; j++) {         String fieldName = layer.getFieldNames()[j];         layerElement += "<field>" + fieldName + "</field>";       }       layerElement += "</fields>";       layerElement += "</layer>";     }     layerElement += "</layers>";      return layerElement;    }    private void loadLayers() {      String[] lyrArr = PropsUtil.getString(LAYERS_TAG).split(",");      layers = new Layer[lyrArr.length];     for (int i = 0; i < layers.length; i++) {        String layerName = PropsUtil.getString(lyrArr[i] + LAYER_NAME_SUFFIX);       String[] flds = PropsUtil.getString(lyrArr[i] + COLUMN_SUFFIX).split(",");       // no values in request structure       layers[i] = new Layer(layerName, flds);     }    }    private String searchModeToStatus(String searchMode) {     String stat = "";     if (searchMode.equals(GISRequest.SEARCH_MODE_ADDRESS)) {       stat = PropsUtil.getString("BOERequest.Status.ADDRESS");     } else if (searchMode.equals(GISRequest.SEARCH_MODE_LATLONG)) {       stat = PropsUtil.getString("BOERequest.Status.LATLONG");     } else if (searchMode.equals(GISRequest.SEARCH_MODE_BOTH)) {       stat = PropsUtil.getString("BOERequest.Status.BOTH");      }      return stat;   } } 

Note: My code has to be in Java 1.4 because of the Legacy EAServer.

Geocoder WebService Client

        
   
   

Lista de respuestas


Relacionados problema

1  Ejecute una aplicación potencialmente larga en un servidor web de Python y devuelva diferentes resultados dependiendo de si la aplicación termina  ( Run a potentially long running application from within a python webserver and re ) 
Quiero una API en un servidor web de matraz / gunicorn para hacer una llamada a una aplicación Java separada y potencialmente larga. Si la aplicación Java ter...

2  Operaciones de ASYNC en WebMethod  ( Async operations in webmethod ) 
¿Cómo puedo mejorar este código, sin devolver la tarea de ASYNC? public class MapUtils { public static <K, V> MapBuilder<K, V> asMap(K key, V value) { ...

1  Llamando a los servicios web de descanso de manera eficiente  ( Calling restful web services efficiently ) 
Necesito usar este código para buscar datos del servicio web y mostrarlos en un sitio correctamente, pero después de solicitar el servicio web, no puedo carga...

2  Automatización de la nueva creación de usuarios con el servicio web C #  ( Automating new user creation with c web service ) 
He creado un servicio web que se puede llamar desde un formulario para agregar nuevos usuarios al sistema. El servicio final agregará a los usuarios a Active ...

4  ASP.NET WEB API HTTP CONTRAR CON PARÁMETROS OPCIONALES  ( Asp net web api http get with optional parameters ) 
Escribiendo mi primer servicio web API API ASP.NET. Todavía aprendiendo el poder de Linq también. Siento que hay una forma más ideomática de hacer esto: pu...

6  API web y procedimientos almacenados  ( Web api and stored procedures ) 
Estoy creando un servicio web que obtiene datos a través de procedimientos almacenados de un DB y proporciona el resultado como JSON. La solución se construye...

38  Sitio HTML5 / CSS por primera vez  ( First time html5 css site ) 
Estoy trabajando en mi primer sitio web HTML5 / CSS y, como todos mis proyectos por primera vez, terminan incómodos, crudos y difíciles de trabajar cuando los...

4  ¿Es este un buen controlador?  ( Is this a good controller ) 
<?php session_start(); include_once("model/Model.php"); class Controller { public $model; public function __construct() { $this->mo...

3  Implementación del método WCF que admite una cadena u objeto como un parámetro de método  ( Implementing wcf method that supports either string or object as a method parame ) 
Tengo el siguiente contrato en un servicio web basado en WCF: public List<string> GetAllPossibleQueryEngineHostNames(Instance instance); Obviamente, pu...

7  Objeto de interfaz de red  ( Network interface object ) 
Escribí una red ... cosa (no realmente telnet); Y es bastante simple. No hay opciones, solo E / S recta. Parece que los programas se hinchan tan fácilmente. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos