如何使用DTO在PHP中使用REST API?

时间:2015-01-08 08:09:56

标签: php rest oop dto guzzle

我有一个API用于为二手车提供融资报价的服务。我的应用程序是用PHP编写的,我通过Composer添加了Guzzle 5.

我之前使用过其他API,只使用XML或只发送一个POST参数数组,但这个更复杂。

此API使用DTO对象,文档说明了这一点:

relies heavily on DTOs to carry data between client and server. The following
sections detail the DTOs. Each web service will serialise and transfer them in their own
formats/methods. It is the responsibility of the client application to correctly construct requests and
parse responses. It is suggested that object serialization and deserialization be used for easier usage.

所以我不知道如何用Guzzle实现这个目标。一些枚举类型是诸如“RequestAssetMotorVehicle”之类的东西。你会在PHP中使用StdClass或Arrays吗?还是上课?我该如何序列化?

Guzzle Docs

1 个答案:

答案 0 :(得分:1)

如果没有API的文档,这很难表达。但我会尝试。我们将使用基于JSON的通用REST API

DTO标准通常是每个公司,有时是每个应用程序。简而言之:DTO是一个序列化对象。

我们说这是一个POST请求(我们正在创建一个新用户)

{
   'name':'john',
   'foo':'bar',
   'site':'stackoverflow.com'
}

JSON是DTO。现在让我们做一个GET

{
   'error':false,
   'results':2,
   'data': [{'name':'john','foo':'bar','site':'stackoverflow.com'}, 
             {'name':'mark','foo':'bar','site':'notstackoverflow.com'}]
}

数据阵列'是一个DTO数组。

所以dox告诉你的是,你需要熟悉你的应用程序与API,通过创建一个层来传递数据以形成你身边的对象,同一层应该拿一个对象然后转动它进入DTO。在某些情况下,您可以使用简单的代码处理来自API的响应,但是在某种情况下,GET请求将返回超过10个您想要用某个类解析它的结果。基本上为DTO创建ORM。

就guzzle而言:将身体设置为通过图层推送数据的结果。

public function createUserWithSomeApi()
{
    $g= new \Guzzle\Client();
    $response = $g->post('http://api.some.place/v1/users', [
                'body' => (new strangeApiDtoParser)->prepare($new_user_data)  
                                         ]);
    return ApiDtoParser::fromDTO($response->getBody());
}

接收

public function getUsersFromSomeApi()
{
    $g= new \Guzzle\Client();
    $response = $g->get('http://api.some.place/v1/users', [
             'query' => ['foo' => 'bar']
                          ]);
    return ApiDtoParser::fromDTO($response->getBody());
}

现在你的解析器:

class ApiDtoParser
{
    public static function fromDto($raw)
    {
        $returnArray=[];
        $decoded =json_decode($data,true);
        foreach($decoded as $one){
            $obj = new DtoObj;
            foreach ($one as $key => $value) {
                $meth = "set". ucfirst(strtolower($key));
                $obj->{$meth}($var);
            }
            $returnArray[]=$obj;
        }
        return $returnArray;
    }
}

根据您摘录的上下文判断,您需要创建基于请求的解析器​​