macOS swift: connecting to German "internetmarke" via SOAP

Viewed 31

Here is my solution for connecting to the German online stamp serivce "Internetmarke" via SOAP for those who need to do the same (sometimes)

    private func stampLogIn() {
        let aktDate = dateFormatterSOAP.string(from: Date())
        
        let partnerID: String = "XXXXX"
        let partnerKey: String = "sajklfgweiqulskdjfvbluw"
        
        let sign: String = partnerID + "::" + aktDate + "::1::" + partnerKey
        
        let signature_key = Insecure.MD5.hash(data: sign.data(using: .utf8)!).map {String(format: "%02x", $0)}.joined()

        let message: String = """
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v3="http://oneclickforapp.dpag.de/V3">
 <soapenv:Header>
  <v3:PARTNER_ID>\(partnerID)</v3:PARTNER_ID>
  <v3:REQUEST_TIMESTAMP>\(aktDate)</v3:REQUEST_TIMESTAMP>
  <v3:KEY_PHASE>1</v3:KEY_PHASE>
  <v3:PARTNER_SIGNATURE>\(signature_key.prefix(8))</v3:PARTNER_SIGNATURE>
 </soapenv:Header>
 <soapenv:Body>
  <v3:AuthenticateUserRequest>
   <v3:username>login_mail@dhldp-test.de</v3:username>
   <v3:password>myPassword</v3:password>
  </v3:AuthenticateUserRequest>
 </soapenv:Body>
</soapenv:Envelope>
"""
        let urlString = "https://internetmarke.deutschepost.de/OneClickForAppV3?wsdl"
        let url = URL(string: urlString)!
        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("\(message.count)", forHTTPHeaderField: "Content-Length")
        request.httpBody = message.data(using: .utf8)
        
        let task = URLSession.shared
            .dataTask(with: request as URLRequest,
                      completionHandler: { data, response, error in
                guard error == nil else {
                    // Handle the error
                    print(error!)
                    return
                }
                guard let data = data else {
                    return
                }
                // Continue checking response or data...
                let dataStr = String(decoding: data, as: UTF8.self)
                // Here goes XML-Parsing
                print(dataStr)
            })
        task.resume()
    }

This ist only for the first step. Of course the other steps have to be done analogically. To be done: the XML parsing of the response.

0 Answers
Related