Swift Alamofire send XML request and receive XML response

北战南征 提交于 2019-12-12 05:45:08

问题


Hi i'm making a move from Objective C to swift. I'm trying to send xml request and receive xml response. How we can do that with Alamofire. Seem only can do for JSON?

my end point: "https://prdesb1.singpost.com/ma/GetItemTrackingDetails"

my sample request body (xml) :

<ItemTrackingDetailsRequest xmlns="http://singpost.com/paw/ns">
<ItemTrackingNumbers>
<TrackingNumber>SMT0000000628</TrackingNumber>
</ItemTrackingNumbers>
</ItemTrackingDetailsRequest>

The response should be

<ItemTrackingDetailsResponse xmlns="http://singpost.com/paw/ns" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ItemsTrackingDetailList>
        <ItemTrackingDetail>
            <TrackingNumber>SMT0000000628</TrackingNumber>
            <TrackingNumberFound>true</TrackingNumberFound>
            <AlternativeTrackingNumber/>
            <TrackingNumberActive>true</TrackingNumberActive>
            <PostingDate/>
            <InsuredValue/>
            <InsuredSDR/>
            <Weight/>
            <ExpressInd/>
            <ItemCategory/>
            <Content/>
            <PreadviceDate/>
            <ReceptacleID/>
            <OriginalCountry>Singapore</OriginalCountry>
            <DestinationCountry>Singapore</DestinationCountry>
            <ItemType>Speedpost</ItemType>
            <DeliveryStatusDetails>
                <DeliveryStatusDetail>
                    <StatusDescription>Recovered item from POPStation for service recovery</StatusDescription>
                    <Location>SPEEDPOST SERVICE CENTRE</Location>
                    <BeatNo/>
                    <Date>2016-08-22T16:35:30</Date>
                    <AceDate>20160822 163530</AceDate>
                </DeliveryStatusDetail>
                <DeliveryStatusDetail>
                    <StatusDescription>Delivered to POPStation</StatusDescription>
                    <Location>POPStation@Yew Tee Square</Location>
                    <BeatNo/>
                    <Date>2016-08-16T17:27:48</Date>
                    <AceDate>20160816 172748</AceDate>
                </DeliveryStatusDetail>
                <DeliveryStatusDetail>
                    <StatusDescription>With Delivery Courier</StatusDescription>
                    <Location>SPEEDPOST SERVICE CENTRE</Location>
                    <BeatNo/>
                    <Date>2016-08-16T11:25:00</Date>
                    <AceDate>20160816 112500</AceDate>
                </DeliveryStatusDetail>
                <DeliveryStatusDetail>
                    <StatusDescription>Received at Processing Facility</StatusDescription>
                    <Location>SPEEDPOST SERVICE CENTRE</Location>
                    <BeatNo/>
                    <Date>2016-08-16T10:28:07</Date>
                    <AceDate>20160816 102807</AceDate>
                </DeliveryStatusDetail>
                <DeliveryStatusDetail>
                    <StatusDescription>Notification of shipment confirmation</StatusDescription>
                    <Location>SPEEDPOST SERVICE CENTRE</Location>
                    <BeatNo/>
                    <Date>2016-08-13T11:10:29</Date>
                    <AceDate>20160813 111029</AceDate>
                </DeliveryStatusDetail>
            </DeliveryStatusDetails>
        </ItemTrackingDetail>
    </ItemsTrackingDetailList>
    <Status>
        <ErrorCode>0</ErrorCode>
        <ErrorDesc>Success</ErrorDesc>
    </Status>
</ItemTrackingDetailsResponse>

Seem there is no default method to deal with XML body data. Any help is much appreciate. Thanks!

update: I have tried to use Almofire but still cannot get the correct response (got nil for parsed response). My server support SSLv3 and TLS 1.0 (have already enable transport securty)

typealias CompletionHandler = (NSError?)->Void

func fetchXML(url: String, trackingNumber: String, completion: CompletionHandler) -> Void {

let params = "<ItemTrackingDetailsRequest xmlns=\"http://singpost.com/paw/ns\"><ItemTrackingNumbers><TrackingNumber>\(trackingNumber.uppercaseString)</TrackingNumber></ItemTrackingNumbers></ItemTrackingDetailsRequest>"

    let xmlRequest = NSMutableURLRequest(URL: NSURL(string: url)!)        
    xmlRequest.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    xmlRequest.HTTPMethod = "POST"
    xmlRequest.addValue("application/xml", forHTTPHeaderField: "Content-Type")

    Alamofire.request(xmlRequest)
             .response { request, response, data, error in

                print("url\(request?.URL?.absoluteString)")
                print("requestBody\(request?.HTTPBody)")
                print(params)

                print("error\(error.debugDescription)")
                print("status code\(response?.statusCode)")
                let xml = XML.parse(data!)
                print(xml.text)

            }
}

and call from viewcontroller

let trackingItemUrl = "https://prdesb1.singpost.com/ma/GetItemTrackingDetails"

    self.networking.fetchXML(trackingItemUrl, trackingNumber: "SMT0000000628") { error in
        print("can we get here?")
    }

来源:https://stackoverflow.com/questions/39318514/swift-alamofire-send-xml-request-and-receive-xml-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!