2011-02-04 12 views
5

Sto provando HTTP Posta una stringa XML su un server WebMethods utilizzando l'autenticazione di base. Stavo cercando di usare il plugin REST che si trova sopra HTTP Builder. Ho provato alcune cose tutte con una risposta di lunghezza 0. Usando il poster di Firefox ho usato lo stesso identico XML e user auth e la risposta di WebMethods è di restituire la richiesta con alcune informazioni extra, quindi è qualcosa che sto facendo nel codice qui sotto che è sbagliato. Spero che qualcuno abbia un puntatore per fare un HTTP Post di XML.Groovy/Grails che invia XML su HTTP (utilizzando il plug-in REST) ​​

string orderText = "<item> 
    <item>1</item> 
    <price>136.000000</price> 
</item>" 


def response = withHttp(uri: "https://someserver.net:4433") { 
     auth.basic 'user', 'pass' 

      // have tried body: XmlUtil.serialize(orderText) 
     def r = post(path: '/invoke/document', body: orderText, contentType: XML, requestContentType: XML) 
     { resp, xml -> 
      log.info resp.status 
      log.info resp.data 
      resp.headers.each { 
      log.info "${it.name} : ${it.value}" 
      } 
     } 
    log.info r 
    return r 
} 

registri dicono:

04-02-2011 14:19:39,894 DEBUG HTTPBuilder - Response code: 200; found handler: [email protected] 
04-02-2011 14:19:39,895 INFO HTTPBuilder - Status: 200 
04-02-2011 14:19:39,896 INFO HTTPBuilder - Data: null 
04-02-2011 14:19:39,896 INFO HTTPBuilder - XML: null 
04-02-2011 14:19:39,913 INFO HTTPBuilder - Content-Type : application/EDIINT; charset=UTF-8 
04-02-2011 14:19:39,913 INFO HTTPBuilder - Content-Length : 0 

Cheers,

Steve

+0

Impossibile farlo funzionare, anche tramite Groovy HTTPBuilder quindi è andato sotto 1 altro livello in Apache HTTPClient, funziona perfettamente – Steve

+0

Steve, dovresti pubblicare la tua soluzione come risposta e accettarla. – rochb

+0

Sto lavorando alla stessa identica cosa, sarebbe bello se potessi pubblicare la tua soluzione. – Slavko

risposta

4

Ecco quello che ho finito con. E 'uso abbastanza standard del client comune HTTP

Per autenticazione di base su SSL si può semplicemente avere il vostro url del tipo: https://user:[email protected]/etc

Grails ricordarsi di copiare il vaso HTTPClient nella cartella lib o nel mio caso ho installato il REST plugin che include comunque HTTPClient.

Ci sono buona documentazione sul sito HTTPClient: http://hc.apache.org/httpcomponents-client-ga/

import org.apache.http.HttpEntity 
import org.apache.http.HttpResponse 
import org.apache.http.client.HttpClient 
import org.apache.http.client.methods.HttpPost 
import org.apache.http.entity.StringEntity 
import org.apache.http.impl.client.DefaultHttpClient 

def sendHttps(String httpUrl, String data) { 
    HttpClient httpClient = new DefaultHttpClient() 
    HttpResponse response 
    try { 
     HttpPost httpPost = new HttpPost(httpUrl) 
     httpPost.setHeader("Content-Type", "text/xml") 

     HttpEntity reqEntity = new StringEntity(data, "UTF-8") 
     reqEntity.setContentType("text/xml") 
     reqEntity.setChunked(true) 

     httpPost.setEntity(reqEntity) 
     log.info "executing request " + httpPost.getRequestLine() 

     response = httpClient.execute(httpPost) 
     HttpEntity resEntity = response.getEntity() 

     log.info response.getStatusLine() 
     if (resEntity != null) { 
      log.with { 
       info "Response content length: " + resEntity.getContentLength() 
       if (isDebugEnabled()) { 
        debug "Response Chunked?: " + resEntity.isChunked() 
        debug "Response Encoding: " + resEntity.contentEncoding 
        debug "Response Content: " + resEntity.content.text 
       } 
      } 
     } 
     // EntityUtils.consume(resEntity); 
    } 
    finally { 
     // When HttpClient instance is no longer needed, 
     // shut down the connection manager to ensure 
     // immediate deallocation of all system resources 
     httpClient.getConnectionManager().shutdown() 
    } 
    return response.getStatusLine() 
} 
1

provarlo in questo modo:

HTTPBuilder builder = new HTTPBuilder(url) 
builder.request(Method.POST) { 
     // set uriPath, e.g. /rest/resource 
     uri.path = uriPath 

     requestContentType = ContentType.XML 

     // set the xml body, e.g. <xml>...</xml> 
     body = bodyXML 

     // handle response 
     response.success = { HttpResponseDecorator resp, xml -> 
      xmlResult = xml 
     } 
} 
+0

Grazie per quello, so di aver provato qualcosa di simile in quanto la soluzione è molto più pulita ... ma è un po 'di tempo fa, quindi i dettagli mi sfuggono ... lo rivisiterò perché penso che forse non ho usato il ContentType .XML – Steve

+0

Questo è il modo relativamente semplice per farlo. il codice sopra mi aiuta davvero, sono rimasto bloccato per 2 ore e il codice sopra funziona al primo tentativo. Ma una cosa è che dovrebbero esserci tutti i barattoli necessari, e ogni volta che una compilazione fallisce, cancella il contesto degli script se stai lavorando all'interno della console di Groovy. – aamir

0

Credo che non c'è bisogno di avere fatto così difficile, io uso un approccio più semplice (dal modo in cui non hai bisogno di plugin aggiuntivi). Quindi prendere in considerazione il prossimo pezzo di codice, e, naturalmente, sto ommiting la parte di autenticazione

class YourController{ 
    static allowedMethods = [operation:['POST','GET']] 

    def operation(){ 
     def xmlRequest = request.reader.text 
     println xmlRequest 
     //TODO: XML postprocessing, here you might use XmlParser.ParseText(xmlRequest) 
    } 
} 

So che questo potrebbe essere fuori dal contesto perché si sta chiedendo per il plugin REST, ma ho voluto condividere questo perché non c'è un'altra alternativa.

Sto usando Grails 2.3.2 e Firefox RESTClient per testare il webservice.