设计C++休息客户端

Designing a C++ rest client

本文关键字:客户端 C++ 设计      更新时间:2023-10-16

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

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

风格 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,但我在这方面不是很有经验。

一种风格明显比另一种更好吗?除了易于开发之外,还有什么原因吗,大多数似乎都是用第一种风格编写的?

这个库肯定会在多线程应用程序和 UI 中使用,所以请在回答时牢记线程。

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

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 中的每个函数调用执行一次是更多的工作。