2011-02-04 17 views
5

Estoy intentando HTTP Publique una cadena XML en un servidor WebMethods usando autenticación básica. Intentaba utilizar el complemento REST que se encuentra en la parte superior de HTTP Builder. He intentado algunas cosas, lo que resulta en una respuesta de 0 longitud. Usando el póster de Firefox, he utilizado la misma autentificación XML y de usuario y la respuesta de WebMethods es repetir la solicitud con algo de información adicional, por lo que es algo que estoy haciendo en el código de abajo que es incorrecto. Espero que alguien tenga un puntero para hacer una publicación HTTP de XML.Groovy/Grails publicando XML a través de HTTP (usando el plugin 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 
} 

Registros dicen:

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

No se pudo hacer funcionar esto, incluso a través de HTTPbuilder de Groovy por lo que pasó por debajo de 1 capa más para Apache HTTPClient, funciona muy bien – Steve

+0

Steve, debe publicar su solución como una respuesta y aceptarla. – rochb

+0

Estoy trabajando en exactamente lo mismo, sería genial si pudiera publicar su solución. – Slavko

Respuesta

4

Esto es lo que terminó con. Es el uso bastante estándar de cliente HTTP común

Para autenticación básica a través de SSL puede simplemente tener su URL como: https://user:[email protected]/etc

Griales recuerdan a copiar el frasco HTTPClient a la carpeta lib o en mi caso he instalado el RESTO complemento que incluye HTTPClient de todos modos.

Hay buenas documentos en el sitio 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

intenta de esta manera:

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

Gracias por eso, sé que intenté algo en ese sentido, ya que la solución es mucho más limpia ... pero hace un tiempo así que los detalles se me escapan ... Volveré a visitar esto porque creo que no he usado el ContentType .XML – Steve

+0

Esa es una forma relativamente fácil de hacerlo. el código anterior realmente me ayuda, me quedé atrapado durante 2 horas y el código anterior funciona en el primer intento. Pero una cosa es que todos los archivos necesarios deben estar allí, y siempre que una compilación falle, borre el contexto del script si está trabajando dentro de la consola Groovy. – aamir

0

supongo que no hay necesidad de lograr que se haga tan difícil, yo uso un método más sencillo (por cierto, no necesitas complementos adicionales). Así que considere el siguiente fragmento de código, y por supuesto que estoy ommiting la parte de autenticación

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) 
    } 
} 

Sé que esto puede estar fuera de contexto porque está solicitando el plugin REST, sin embargo, que quería compartir esta ya que no hay otra alternativa

Estoy usando grails 2.3.2 y Firefox RESTClient para probar el servicio web.

Cuestiones relacionadas