0

我正在编写一个 REST API,目前正在测试一些东西。我试图让它在数据库中找不到任何内容时发送错误响应。

正在运行的部分(因为我目前正在通过在浏览器中输入 url 进行测试)如下:

    else if ($request->getHttpAccept() === 'xml')  
    {  
        if(isset($data['s']) && isset($data['n'])) {
            $id = $db->getAlcoholIDByNameSize($data['n'], $data['s']);
            $prices = $db->pricesByAlcohol($id);
        }
        if(isset($id)) {
            $resData = array();
            if(!empty($prices)) {
                foreach($prices as $p) {
                    $store = $db->store($p['store']);
                    array_push($resData, array('storeID' => $p['store'], 'store_name' => $store['name'], 'store_gps' => $store['gps'], 'price' => round($p['price'], 2)));
                }
                RestUtils::sendResponse(200, json_encode($resData), 'application/json'); 
            } else {
                RestUtils::sendResponse(204, 'error', 'application/json'); 
            }
        } else {
            RestUtils::sendResponse(204, 'error', 'application/json'); 
        }
        //RestUtils::sendResponse(501, "xml response not implemented", 'application/xml');  
    }  

如果查询返回要存储在 $id 和 $prices 中的内容,则一切正常。但是,如果它们在数据库中不存在,它会尝试加载该页面,然后返回到您所在的上一个页面。您可以通过以下方式查看行为:

http://easyuniv.com/API/alc/coorsa/2   <-- works
http://easyuniv.com/API/alc/coors/3    <-- works
http://easyuniv.com/API/alc/coorsa/5   <-- doesn't work(or anything else, the two above are the only ones)

这是我的 sendResponse 函数:

   public static function sendResponse($status = 200, $body = '', $content_type = 'text/html')  
    {  
        $status_header = 'HTTP/1.1 ' . $status . ' ' . RestUtils::getStatusCodeMessage($status);  
        // set the status  
        header($status_header);  
        // set the content type  
        header('Content-type: ' . $content_type);  

        // pages with body are easy  
        if($body !== '')  
        {  
            $temp = json_decode($body);
            $body = json_encode(array('result' => array('status' => $status, 'message' => RestUtils::getStatusCodeMessage($status)), 'data' => $temp));
            // send the body  
            echo $body;  
            exit;  
        }  
        // we need to create the body if none is passed  
        else  
        {           
            $body = "else".json_encode(array('result' => array('status' => $status, 'message' => RestUtils::getStatusCodeMessage($status))));

            echo $body;  
            exit;  
        }  
    } 

我曾尝试使用回声进行调试,但我似乎无法缩小问题的范围。任何帮助将不胜感激,谢谢。

4

1 回答 1

1

问题是,当您返回的数据库中没有找到合适的数据时,HTTP 204这告诉浏览器绝对没有任何东西可以显示。在您的情况下,情况并非如此。

你仍然想输出没有找到的消息。

要修复,您需要将204代码中的两个实例替换为200.

我修改了测试你的代码使用:注意,什么都不会显示。获取消息以显示204变量中200的更改。$status_header

<?php
        $status_header = 'HTTP/1.1 204';

        // set the status  
        header($status_header);  
        // set the content type  
        header('Content-type: text/html');

        echo "Can you see me???";
?>

注意:在测试时,请始终关闭选项卡并为每个调用使用一个新选项卡,否则它看起来像是从上一个调用中加载数据,就像你已经解释的那样。

于 2012-12-19T21:42:32.850 回答