1

假设 web 服务提供者的服务器以http://example.com:8000/api的形式公开 web 服务

在 ios 7 项目中访问 web 服务的最佳框架或库是什么

4

1 回答 1

0

There are a few marshaling frameworks that support generating an object-graph from XML, however I would simply go for the following:

  • Invoke the service endpoint. My favorite library is BBHTTP, however you could use AFNetworking, NSURLConnection with gcd or whatever you prefer for asynch network calls.
  • Extract the relevant contents of the XML payload onto your use-case specific payload object using RaptureXML

I recommend having use-case specific payload objects because they model exactly what is needed for a given service invocation - supporting the notion of contract-first development. This allows you to change you internal model without effecting the integration to external systems. Similarly the external API can change without effecting your model.

You can create a category method on RXMLElement to return the element mapped to a use-case-specific object. A typical mapping usually takes just a handful of lines of code to marshal from wire-format to your payload object for the service invocation.

Here's an example (the code that I took it from wanted the payload wrapped in a SOAP envelope - just ignore that bit).

- (void)request:(MyUseCaseRequstPayload*)request onComplete:(void (^)(MyResponsePayload*))onSuccess
        onError:(void (^)(NSError*))onError;
{
    //Even more XML! You can stick your payload inside an envelope if you want
    SoapEnvelope* envelope = [SoapEnvelope envelopeWithContent:[request xmlString]];

    [[BBHTTPRequest postToURL:_serviceUrl data:[envelope data] contentType:@"text/xml"] execute:^(BBHTTPResponse* response)
    {
        RXMLElement* element = [RXMLElement elementFromXMLData:[response content]];
        MyResponsePayload* response = [[element child:@"elementToBeMapped"] asMyObjectType];
        if (onSuccess)
        {
            onSuccess(response);
        }

    } error:^(NSError* error)
    {
        LogDebug(@"Got error: %@", error);
        if (onError)
        {
            onError(error);
        }
    }];
}
于 2013-10-31T02:04:34.193 回答