2015-02-05 3 views
1

Я пытаюсь отправить запрос POST в Restful WS с запросом, первоначально являющимся xml, и поэтому является ответом.Groovy httpBuilder POST XML с базовой аутентификацией

Мне также нужна базовая аутентификация. Сначала у меня возникали проблемы с не определенными классами, и, к счастью, для решения этого потребовалось 6 банок.

Теперь я получаю следующее: Caught: groovyx.net.http.HttpResponseException: Bad Request

Похоже, это не нравится запрос POST. Я пробовал разные способы, включая RESTClient, я попытался делегировать запрос в его необработанном XML-формате, передав файл или как строку var. Я не совсем понимаю разницу между методами post или request в httpBuilder.

Если кто-нибудь может помочь мне точку в том, что я сделал неправильно было бы очень благодарен

def http = new HTTPBuilder('http://some_IP:some_Port/') 
http.auth.basic('userName','password') 
http.post(path:'/path/ToServlet') 

http.post(POST,XML) 
{ 

    delegate.contentType="text/xml" 
    delegate.headers['Content-Type']="text/xml" 
    //delegate.post(getClass().getResource("/query.xml")) 
// body = getClass().getResource("/query.xml") 
    body = 
    { 
     mkp.xmlDeclaration() 

     Request{ 
      Header{ 
        Command('Retrieve') 
        EntityIdentifiers 
        { 
         Identifier(Value:'PhoneNumber', Type:'TelephoneNumber') 
         } 
            EntityName('Subscriber') 
        } 
     } 
    } 
} 

Теперь в случае, если я перевел XML неправильно в моем запросе здесь является версия XML из него:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Provisioning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Request> 
    <Header> 
     <Command>Retrieve</Command> 
     <EntityIdentifiers> 
      <Identifier Value="phoneNumber" Type="TelephoneNumber" /> 
     </EntityIdentifiers> 
     <EntityName>Subscriber</EntityName> 
    </Header> 
</Request> 
</Provisioning> 

ответ

1

нормально так после того, как когда-то я собрал решение было в обновлении заводной библиотеки до 2,4 и httpClient4.0.1 и httpBuilder 4.x

Это, кажется, сделал трюк, как я изначально работала с groovy 1.5.5 Другой вариант, который у вас есть, - это использовать Java и Groovy вместе Java для установления соединения с использованием URL-адресов и классов HttpURLConnection, мы надеемся, что примеров достаточно. Помните, что это не SSL и, возможно, потребуется принять дополнительные шаги, если вы хотите сделать это с помощью SSL и HTTPS

import groovy.xml.* 
import groovy.util.XmlSlurper.* 
import groovy.util.slurpersupport.GPathResult.* 


import groovyx.net.http.HTTPBuilder 

import groovyx.net.http.EncoderRegistry 
import java.net.URLEncoder 
import java.net.URLEncoder.* 
import org.apache.http.client.* 
import org.apache.http.client.HttpResponseException 
import org.apache.http.protocol.ResponseConnControl; 
import org.apache.http.conn.ssl.* 
import org.apache.http.conn.ssl.TrustStrategy 

import static java.net.URLEncoder.encode 
import static groovyx.net.http.ContentType.* 
import static groovyx.net.http.HTTPBuilder.request 
import static groovyx.net.http.Method.POST 
//import static groovyx.net.http.RESTClient.* 


def SMSCmirrorServerTor = "http://IP:PORT" 
def SMSCmirrorServerMntrl = "http://IP:PORT" 


def msisdn = args[0] 

//Connect to method HTTP xml URL encoded request, XML response 
def connectSMSC(server, MSISDN) 
{ 
    // Variables used for the response 
    def result = "" 
    //Variables used for request 
    // one way is to use raw xml 
    def rawXML = """ 
    <Provisioning xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 
      <Request> 
        <Header> 
          make sure your <xml> is well formatted use xml formatter online if need be 
        </Header> 
      </Request> 
    </Provisioning>""" 

    def http = new HTTPBuilder(server) 
    http.auth.basic('username','password') 
    http.contentType = TEXT 
    http.headers = [Accept: 'application/xml', charset: 'UTF-8'] 

    http.request(POST) 
    { 
     uri.path = 'Servlet or WS/Path' 
     requestContentType = URLENC 
     body = "provRequest=" + encode(rawXML,"UTF-8") 


     response.success = { resp, xml -> 

     def xmlParser = new XmlSlurper().parse(xml) 
     //Helps if you know in advance the XML response tree structure at this point it's only xmlSlurper doing the work to parse your xml response 
     def ResponseStatus = xmlParser.Response.Header.ResponseStatus 
     result += "Response Status: " + ResponseStatus.toString() + "\n================\n" 

     def ResponseHeader = xmlParser.Response.Header.Errors.Error 
     ResponseHeader.children().each 
     { 
      result += "\n${it.name()}: " + it.text().toString() + "\n" 

     } 

     def xmlDataRootNode = xmlParser.Response.Data.Subscriber 
     xmlDataRootNode.children().each 
     { 

      if (it.name() == 'UserDevices') 
      { 
      result += "\n" + it.UserDevice.name() + " :" + "\n-----------------\n" 
      it.UserDevice.children().each 
      { 
       result += it.name() + " :" + it.text().toString() + "\n" 
      } 
      } 
      else 
      { 
      result += "\n${it.name()}: " + it.text().toString() + "\n" 
      } 

     }//End of each iterator on childNodes 

     if (ResponseStatus.text().toString() == "Failure") 
     { 
      def ErrorCode = resp.status 
      result += "Failed to process command. Bad request or wrong input" 
      //result += "\nHTTP Server returned error code: " + ErrorCode.toString() 
      // Note this error is for bad input server will still return status code 200 meaning o.k. unlike err 401 unathorized or err 500 those are http errors so be mindful of which error handling we're talking about here application layer vs http protocol layer error handling 
     } 

     }//End of response.success closure 
    }//End of http.request(POST) method 

    result 
}//end of connectSMSC method 


//the following is only in case server A is down we can try server B 
def finalResponse="" 
try 
{ 
    finalResponse += connectSMSC(SMSCmirrorServerTor,msisdn) 

} 

catch(org.apache.http.conn.HttpHostConnectException e) 
{ 

    finalResponse += "Encountered HTTP Connection Error\n ${e}\n Unable to connect to host ${SMSCmirrorServerTor}\n Trying to connect to mirror server ${SMSCmirrorServerMntrl} instead\n" 
    finalResponse += connectSMSC(SMSCmirrorServerMntrl,msisdn) 
} 
catch (groovyx.net.http.HttpResponseException ex) 
{ 

    finalResponse += "Encountered HTTP Connection Error Code: ${ex.statusCode}\n" 
    finalResponse += connectSMSC(SMSCmirrorServerMntrl,msisdn) 
} 
/* 
* 
* java.lang.IllegalArgumentException: port out of range: 

*/ 
catch(java.lang.IllegalArgumentException e) 
{ 
finalResponse += "Error: " + e 
} 

catch(java.io.IOException e) 
{ 

    finalResponse += "IO Error: " + e 
    finalResponse += connectSMSC(SMSCmirrorServerMntrl,msisdn) 
} 
catch(java.io.FileNotFoundException e) 
{ 

    finalResponse += "IO Error: " + e 
    finalResponse += connectSMSC(SMSCmirrorServerMntrl,msisdn) 
} 


println finalResponse.toString() 
0

Похоже, вы делаете сообщения, ни одно из которых не правильно сформировано. Попробуйте что-то вроде этого:

def writer = new StringWriter() 

def req = new MarkupBuilder(writer) 
req.mkp.xmlDeclaration(version:"1.0", encoding:"utf-8") 
req.Provisioning { 
    Request { 
     Header { 
      Command('Retrieve') 
      EntityIdentifiers { 
       Identifier(Value:'PhoneNumber', Type:'TelephoneNumber') 
      } 
      EntityName('Subscriber') 
     } 
    } 
} 

def http = new HTTPBuilder('http://some_IP:some_Port/path/ToServlet') 
http.auth.basic('userName','password') 
http.post(contentType:XML, query:writer) { resp, xml -> 
    // do something with response 
} 
+0

Спасибо @MichaelRutherford Это, кажется, немного лучше, теперь я могу реально увидеть хорошо отформатированный запрос xml однако HTTPBuilder жалуется на совместимые типы аргументов Теперь я получаю следующее при запуске groovy script в командной строке: java.io.StringWriter нельзя отнести к java.util.Map – user3849802

+0

и в Eclipse Я получаю эту ошибку сказал, что это groovyx.net с ошибкой Eclipse: Нет подписи метода: groovyx.net.http.HTTPBuilder.post() применимо для типов аргументов: (java.util.LinkedHashMap, SMSC $ _run_closure2) значения: {["contentType": application/xml, "query": @Michael Rutherfurd – user3849802

+0

groovy.xml.MarkupBuilder не может быть отброшен в java.util.Map, получая ошибки при запуске. Map или LinkedHashMap из xml.MarkupBuilder любая идея, как отличить правильный тип !!? – user3849802

Смежные вопросы