具有指定http标头的CakePHP JSON响应

时间:2015-07-06 16:22:28

标签: json cakephp

我需要在我的cakePHP 2.6 webapp中实施xsolla支付解决方案 根据合同,我的网站应该通过REST与Xsolla进行沟通。

Xsolla对同一个网址(例如http://example.com/rest)执行所有请求并指定JSON正文中的请求类型,
例如来自Xsolla的请求:

URL: http://example.com/rest
Accept: application/json
Content-Type: application/json
Content-Length: 78
Authorization: Signature 8189119fb35327cdee7787990df41001c4bd9122
{"data":{"notification_type":"user_validation","user":{"id":"user_id"}}}

如果用户ID无效,我应该返回带有错误代码的 HTTP / 1.1 400错误请求;如果用户ID有效,我应该返回 HTTP / 1.1 200 OK
/> notification_type可以是user_validationpayment等等 我在单个函数xsolla中实现了XsollaController.php中的所有通信:

//XsollaController.php:
public function xsolla() {
    //...
    $data = $this->request->data;
    if(array_key_exists("notification_type", $data) &&
            $data["notification_type"]=="user_validation") {
        //user_validation
    }
    else if(array_key_exists("notification_type", $data) &&
            $data["notification_type"]=="payment") {
        //payment
    }
    //...
}

如何根据notification_type提供不同的功能?
例如函数userValidation($data)payment($data)等。

使用指定的HTTP代码返回简单JSON的正确方法是什么? 现在我做以下事项:

if(userIdIsValid($userID)) {
    $body = array('data' => array('user' => array(
        "id"=>$data["user"]["id"]), 'message' => 'USER_IS_VALID'));
    $this->response->type('json');
    $this->response->statusCode(200);
    $this->response->body(json_encode($body));
    $this->response->send();
    $this->_stop();
    exit();
}
else {
    $body = array('error' => array(
        'code' => 'INVALID_USER', 
        'message' => 'INVALID_USER', 
        'user' => array("id"=>$data["user"]["id"])));
    $this->response->type('json');
    $this->response->statusCode(400);
    $this->response->body(json_encode($body));
    $this->response->send();
    $this->_stop();
    exit();
}

我的代码有效,但似乎是硬编码的。我相信CakePHP提供了一种更好的方法。

1 个答案:

答案 0 :(得分:0)

关于基于notification_type执行不同功能的第一个问题,你几乎就在那里(除非我过分简化你的问题)。

//XsollaController.php:
public function xsolla() {
    //...
    $data = $this->request->data;
    if(array_key_exists("notification_type", $data) &&
            $data["notification_type"]=="user_validation") {
        $this->userValidation($data);
    }
    else if(array_key_exists("notification_type", $data) &&
            $data["notification_type"]=="payment") {
        $this->payment($data);
    }
    //...
}

private function userValidation($data) {
    // user validation
}

private function payment($data) {
    // payment
}

至于使用JSON内容和正确的HTTP状态代码进行响应,您的代码看起来很好。有一些小改进的空间,但如果它有功能,我就离开它。您正在设置响应代码。如果你想要真正的"蛋糕"使用JSON内容进行响应的方法,请阅读CakePHP文档中的JSON and XML views