2013-07-27 6 views
6

Znalazłem przykład jak zadzwonić usługa ze skryptami napędowych google tutaj: https://developers.google.com/apps-script/articles/soap_geoip_exampleJak przekonwertować nieaktualne wywołanie SoapService do nowego UrlFetchApp

function determineCountryFromIP(ipAddress) { 
    var wsdl = SoapService.wsdl("http://www.webservicex.net/geoipservice.asmx?wsdl"); 
    var geoService = wsdl.getGeoIPService(); 

    var param = Xml.element("GetGeoIP", [ 
       Xml.attribute("xmlns", "http://www.webservicex.net/"), 
       Xml.element("IPAddress", [ 
       ipAddress 
       ]) 
      ]); 

    var result = geoService.GetGeoIP(param); 
    return result.Envelope.Body.GetGeoIPResponse.GetGeoIPResult.CountryCode.Text; 
} 

jednak używa wich SoapService jest przestarzała. Dokumentacja mówi, że powinienem użyć UrlFetchApp Konwersja xml wejściowej jest łatwa. Ale czy ktoś może mi powiedzieć, jak połączyć się z usługą internetową za pomocą UrlFetchApp?

+0

Oznacz to pytanie przez "google-apps-script" zamiast "google-drive" -sdk'. –

Odpowiedz

8

Okazuje się, że to dużo więcej pracy, ale po całym dniu googlowania i próbuje mam go do pracy z UrlFetchApp

function UrlFetchAppDetermineCountryFromIP_(ipAddress) { 
    var xml =   
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
    +"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" 
     +"<SOAP-ENV:Body>" 
     +"<GetGeoIP xmlns=\"http://www.webservicex.net/\">" 
      +"<IPAddress>"+ ipAddress +"</IPAddress>" 
     +"</GetGeoIP>" 
     +"</SOAP-ENV:Body>" 
    +"</SOAP-ENV:Envelope>" 

    var options = 
    { 
    "method" : "post", 
    "contentType" : "text/xml", 
    "payload" : xml 
    }; 

    var result = UrlFetchApp.fetch("http://www.webservicex.net/geoipservice.asmx?wsdl", options); 

    var xmlResult = XmlService.parse(result).getRootElement(); 
    var soapNamespace = xmlResult.getNamespace("soap"); 
    var getGeoIPResponse = xmlResult.getChild("Body", soapNamespace).getChildren()[0]; 
    var getGeoIPResponseNamespace = getGeoIPResponse.getNamespace(); 

    return getGeoIPResponse 
    .getChild("GetGeoIPResult", getGeoIPResponseNamespace) 
    .getChild("CountryCode", getGeoIPResponseNamespace) 
    .getText(); 
} 

Należy probely być posable zbudować xml ładunku z XmlService , jednak próbowałem tego przez kilka godzin i nie mogłem umieścić 4 atrybutów xmlns na elemencie Evnelope, co spowodowało, że żądanie usługi sieciowej się nie powiodło

+0

Otrzymuję odpowiedź 400 z serwera ... ponieważ jego google, nie wiem, jak faktycznie jest wykonywane żądanie, jeśli użyję getRequest, żądanie wygląda dobrze. Jakaś pomoc ? –

+0

Po raz kolejny wypróbowałem to ponownie i powyższy kod nadal działa, jeśli otrzymasz 400 (złe żądanie), może to być spowodowane tym, że twój xml nie jest poprawnie zbudowany, pomyśl o ucieczce podwójnych cudzysłowów i ukośników, również może to być decyzja serwera docelowego zwrócić złe żądanie, nawet jeśli prośba jest poprawna, ale jest coś, za czym tęskni lub nie podoba się – Jarno

+0

Dzięki za wspaniałą odpowiedź! Pierwszy działający przykład użycia UrlFetchApp do serwisów internetowych, które znalazłem, mimo że trochę go szukałem! –

Powiązane problemy