Groovy / Grails публикует XML через HTTP (используя плагин REST) - PullRequest
5 голосов
/ 04 февраля 2011

Я пытаюсь HTTP Опубликовать строку XML на сервере WebMethods с использованием базовой аутентификации. Я пытался использовать плагин REST, который находится поверх HTTP Builder. Я перепробовал несколько вещей, которые привели к получению ответа 0 длины. Используя постер Firefox, я использовал точно такой же XML-код и аутентификацию пользователя, и ответ WebMethods заключается в том, чтобы повторить запрос с некоторой дополнительной информацией, поэтому я ошибаюсь в приведенном ниже коде. Надеюсь, у кого-то есть указатель для выполнения HTTP-публикации XML.

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   
}

В журналах написано:

04-02-2011 14:19:39,894 DEBUG HTTPBuilder - Response code: 200; found handler:    OrdersService$_closure1_closure2_closure3_closure4@36293b29
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

Приветствия

Steve

Ответы [ 3 ]

5 голосов
/ 29 марта 2011

Вот что я закончил.Это довольно стандартное использование обычного HTTP-клиента

Для базовой аутентификации через SSL вы можете просто указать свой URL-адрес: https://user:pass@www.target.com/etc

Grails не забудьте скопировать jar-файл HTTPClient в папку lib или вВ моем случае я установил плагин REST, который все равно включает HTTPClient.

На сайте 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()
}
2 голосов
/ 20 февраля 2012

попробуйте так:

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 голосов
/ 26 ноября 2013

Я думаю, нет необходимости делать это так сложно, я использую более простой подход (кстати, вам не нужны дополнительные плагины). Итак, рассмотрим следующий фрагмент кода, и, конечно, я пропускаю часть аутентификации

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

Я знаю, что это может быть вне контекста, потому что вы запрашиваете плагин REST, но я хотел поделиться этим, так как есть другая альтернатива.

Я использую Grails 2.3.2 и Firefox RESTClient для тестирования веб-службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...