设计C ++休息客户端

时间:2012-08-14 03:45:39

标签: c++ multithreading rest coding-style client

我目前正准备设计一个C或C ++库来访问现有的Rest服务,但这是我不确定的地方:

我见过的大多数API客户端库都提供了一种非常接近ReST API的调用样式,您必须阅读ReST API文档才能使用它。他们并不是真正用他们的母语风格IMO编写的。它们基本上包装了一个http库,可能是一个XML / JSON库,并处理一些特殊的东西,比如auth:

样式1:

paramList.add( "name", "Joe" )
response = makeARestCall( POST, "path/to/resource", paramList, miscAuthData );
if( result.code == 200 ) {
    //success
    xml = response.getXml();
    somethingWeCareAbout = xpath.parse( xml, "response/something/we/care/about" );
    print somethingWeCareAbout
} else {
    print "Something went wrong"
}

使用语言的约定而不是API似乎更自然。考虑使用API​​作为调用函数而不是访问资源。

样式2:

try {
   Api.setName( UserId, "Joe" );
   print Api.getSomethingWeCareAbout();
} catch( ApiException e ) {
   print e.getMessage();
}

我已经用后一种风格编写了API库,他们需要做更多的工作,但我发现使用它们并将其集成到应用程序中更加自然,特别是对于复杂的ReST API,但我对此并不是很有经验。

一种风格明显优于另一种吗?有没有理由,除了易于开发之外,大多数似乎是用第一种风格写的?

这个库肯定会用在多线程应用程序和用户界面中,所以请以线程为主题进行回答。

1 个答案:

答案 0 :(得分:1)

在考虑完之后,对我自己的问题的部分回答是第一种风格可能更容易多线程。使用该库的人可以创建如下函数:

void asyncRestCall( Method method, String resource, map<String,String> parameters, misc misc, function onCompletion ) {
    //fork a new thread
    ...

    //do the call
    result = makeARestCall( method, resource, parameters misc );

    //back in original thread
    ...

    onCompletion( result );
}

然而,对于样式2中的每个函数调用,这样做一次就更有效了。