【问题标题】:Slim restful webservice苗条宁静的网络服务
【发布时间】:2016-03-18 18:45:44
【问题描述】:

我有一个简单的 restful web 服务,托管在 byethost 上。

require 'vendor/autoload.php';

require 'database.php';

use Slim\Slim;


//for cors
$corsOptions = array(
    "origin" => "*",
    "exposeHeaders" => array("Content-Type", "X-Requested-With", "X-authentication", "X-client"),
    "allowMethods" => array('GET', 'POST', 'PUT', 'DELETE', 'OPTIONS')
);

$app = new Slim();

$app->add(new \CorsSlim\CorsSlim($corsOptions));


//2 params
//first - device_id
//second - state
$app->get('/api/changestate','changeState');

//1 param
//param = value
$app->get('/api/changetemp','changeTemp');

$app->get('/api/openall','openAll');

$app->get('/api/closeall','closeAll');

$app->get('/api/getstate','getState');

$app->get('/api/gettemp','getTemp');




function changeState(){
    global $pdo;

    $app = Slim::getInstance();

    $deviceId = $app->request->params('device_id');

    //1-ON
    //0-OFF
    $state = $app->request->params('state');

    $sql  = 'UPDATE device SET state=? WHERE id=?';

    $perepareStatement  = $pdo->prepare($sql);

    $perepareStatement->execute(array($state,$deviceId));

}

function changeTemp(){
    global $pdo;

    $app = Slim::getInstance();

    $value = $app->request->params('value');


    $sql = 'UPDATE sensor SET value=? WHERE id = 1';

    $perepareStatement = $pdo->prepare($sql);

    $perepareStatement->execute(array($value));

}

function openAll(){
    global $pdo;

    $sql = 'UPDATE device SET state=1';

    $perepareStatement = $pdo->prepare($sql);

    $perepareStatement->execute(array());
}

function closeAll(){
    global $pdo;

    $sql = 'UPDATE device SET state=0';

    $perepareStatement = $pdo->prepare($sql);

    $perepareStatement->execute(array());
}


function getState(){

    global $pdo;

    $sql = 'SELECT * FROM device';

    $query = $pdo->query($sql);

    $result = $query->fetchAll(PDO::FETCH_ASSOC);

    echo json_encode($result);

}


function getTemp(){

    global $pdo;

    $sql = 'SELECT * FROM sensor';

    $query = $pdo->query($sql);

    $result = $query->fetchAll(PDO::FETCH_ASSOC);

    echo json_encode($result);


}

$app->run();



?>

当我从浏览器访问此网络服务时,它工作正常。但是当我尝试从 Postman REST 客户端或使用 Httpurlconnection 类的 android 访问时,它给了我以下响应:

<html>
    <body>
        <script type="text/javascript" src="/aes.js" ></script>
        <script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f
            <d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("4a187380bc9ff2b039ef2a8c5d6a5a12");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";location.href="http://homecontrol.byethost32.com/api/gettemp?ckattempt=1";
            </script>
            <noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
        </body>
    </html>

我认为问题与 CORS 有关,我添加了 corsSlim 但没有运气。我对这些技术很陌生。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

  • 看来您必须使用 Postman/Android 模拟 javascript 行为。
  • 我希望我的 rest api 能够被客户端(android/postman)连接,而不必担心这个“javascript 的东西”。就像连接到公共 api,比如 twitter api,这很简单。怎么办我需要做我的休息 api 来获得这种行为。

标签: cors httpurlconnection slim postman


【解决方案1】:

您的问题似乎与网络有关。从浏览器访问时,您可能正在使用localhost 或者您已经设置了主机地址(例如使用/etc/hosts 文件时)。但是,当您从 Android 设备调用相同的 URL 时,您正在从网络外部访问 IP/地址。

我认为这是因为您收到的响应似乎与家庭自动化系统有关。更精确的温度传感器:http://homecontrol.byethost32.com/api/gettemp?ckattempt=1.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多