如何使用目标 c 调用 xml-rpc 网络服务


假设 Web 服务

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

什么是

访问ios 7项目中Web服务的最佳框架或库

有一些封送处理框架支持从XML生成对象图,但是我只想做以下几点:

  • 调用服务终结点。我最喜欢的库是BBHTTP,但是你可以使用AFNetworking,NSURLConnection和gcd或任何你喜欢的异步网络调用。
  • 使用 RaptureXML 将 XML 有效负载的相关内容提取到特定于用例的有效负载对象上

我建议使用特定于用例的有效负载对象,因为它们可以准确建模给定服务调用所需的内容 - 支持契约优先开发的概念。这允许您更改内部模型,而不会影响与外部系统的集成。同样,外部 API 可以在不影响模型的情况下进行更改。

您可以在 RXMLElement 上创建一个类别方法,以返回映射到特定于用例的对象的元素。典型的映射通常只需要几行代码即可从线格式封送到有效负载对象以进行服务调用。

下面是一个示例(我从中获取它的代码希望将有效负载包装在 SOAP 信封中 - 只需忽略该位)。

- (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);
        }
    }];
}

最新更新