Devo racchiudere i dati della richiesta di servizio Web in un oggetto aggiuntivo?

1

Sto preparando alcuni servizi web con Spring WS. A causa del suo primo contratto, ho seguito la sua guida e preparato un XSD.

Finora, il mio XML di richiesta del servizio Web assomiglia a questo (questa è una richiesta resa SoapUI):

<soapenv:Envelope ...>
   <soapenv:Header/>
   <soapenv:Body>
      <sch:WorkOrderRequest>
         <sch:workOrder>
            <sch:catOds>?</sch:catOds>
            <sch:descr>?</sch:descr>
            <sch:idEqui>?</sch:idEqui>
            <...>
         </sch:workOrder>
      </sch:WorkOrderRequest>
   </soapenv:Body>
</soapenv:Envelope>

Codice endpoint Java:

@org.springframework.ws.server.endpoint.annotation.Endpoint
public class WorkOrderEndpoint {

    private static final String NAMESPACE_URI = ...;

    @ResponsePayload
    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "WorkOrderRequest")
    public WorkOrderResponse handleWorkOrderRequest(@RequestPayload WorkOrderRequest request) throws Exception {
        // ...
    }

}

Richiedi oggetto di livello superiore

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {

})
@XmlRootElement(name = "WorkOrderRequest", namespace = "...")
public class WorkOrderRequest {

    @XmlElement(namespace = "", required = true)
    protected WorkOrder workOrder;

    // ...

}

Busta "Ordine di lavoro":

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "WorkOrder", ...)
public class WorkOrder {

    @XmlElement(namespace = ...)
    protected String catOds;

    @XmlElement(namespace = ...)
    protected String descr;

    @XmlElement(namespace = ...)
    protected String idEqui;

    // ...

}

Sto iniziando a chiedermi se questo extra WorkOrder wrap sia utile. Prima di rimuoverlo vorrei ricevere alcuni suggerimenti: dovrei liberarmene e spostare tutte le proprietà all'interno dell'oggetto richiesta? La rimozione potrebbe rendere il servizio Web meno a prova di futuro?

    
posta watery 01.10.2018 - 18:23
fonte

1 risposta

2

Avere un wrapper esplicito consente al tuo codice di dichiarare il suo intento, senza ulteriore conoscenza dell'endpoint.

Confrontiamo due versioni di XML:

Versione avvolta:

<soapenv:Envelope ...>
   <soapenv:Header/>
   <soapenv:Body>
      <sch:WorkOrderRequest>
         <sch:workOrder>
            <...>
         </sch:workOrder>
      </sch:WorkOrderRequest>
   </soapenv:Body>
</soapenv:Envelope>

Versione non imballata

<soapenv:Envelope ...>
   <soapenv:Header/>
   <soapenv:Body>
      <sch:workOrder>
         <...>
      </sch:workOrder>
   </soapenv:Body>
</soapenv:Envelope>

Per me, le differenze sono significative per un essere umano. La versione "Avvolto" ha un tag XML il cui nome indica come verranno utilizzati i tag <sch:workOrder> . Il <sch:WorkOrderRequest> mi dice che questa è una richiesta per elaborare alcuni ordini di lavoro.

Nella versione "Unwrapped" vedo solo un ordine di lavoro. I tag XML non mi dicono come umano ciò che la macchina farà con queste informazioni. L'URL dell'endpoint può aiutare a chiarirlo (ad esempio un POST a / workorders / process), ma se stai guardando solo il codice Java, non vedrai l'URL.

La versione "Wrapped" offre anche una certa flessibilità nell'elaborazione di più ordini di lavoro in futuro, se lo desideri:

<soapenv:Envelope ...>
   <soapenv:Header/>
   <soapenv:Body>
      <sch:WorkOrderRequest>
         <sch:workOrder>
            <...>
         </sch:workOrder>
         <sch:workOrder>
            <...>
         </sch:workOrder>
         <sch:workOrder>
            <...>
         </sch:workOrder>
      </sch:WorkOrderRequest>
   </soapenv:Body>
</soapenv:Envelope>

Puoi ancora farlo nella versione "Unwrapped", ma di nuovo si pone la domanda, "cosa verrà fatto con questi ordini di lavoro multipli?"

    
risposta data 01.10.2018 - 18:53
fonte

Leggi altre domande sui tag