如何为此RESTful实现发送$ http.delete()请求?

时间:2017-04-20 19:50:34

标签: php angularjs json rest http

这是我的PHP代码。

<?php

    header("Content-Type: application/json");
    // get the HTTP method, path and body of the request
    $method = $_SERVER['REQUEST_METHOD'];
    $request = explode('/', trim($_SERVER['PATH_INFO'],'/'));
    var_dump($request);
    $input = json_decode(file_get_contents('php://input'),true);

    // connect to the mysqli database
    $link = mysqli_connect('localhost', 'root', 'hello', 'agita');
    mysqli_set_charset($link,'utf8');

    // retrieve the table and key from the path
    $table = preg_replace('/[^a-z0-9_]+/i','',array_shift($request));
    $key = array_shift($request)+0;

    // escape the columns and values from the input object
    $columns = preg_replace('/[^a-z0-9_]+/i','',array_keys($input));
    $values = array_map(function ($value) use ($link) {
      if ($value===null) return null;
      return mysqli_real_escape_string($link,(string)$value);
    },array_values($input));

    // build the SET part of the SQL command
    $set = '';
    for ($i=0;$i<count($columns);$i++) {
      $set.=($i>0?',':'').'`'.$columns[$i].'`=';
      $set.=($values[$i]===null?'NULL':'"'.$values[$i].'"');
    }

    // create SQL based on HTTP method
    switch ($method) {
      case 'GET':
        $sql = "select * from `$table`".($key?" WHERE id=$key":''); break;
      case 'PUT':
        $sql = "update `$table` set $set where id=$key"; break;
      case 'POST':
        $sql = "insert into `$table` set $set"; break;
      case 'DELETE':
        $sql = "delete `$table` where id=$key"; break;
    }

    // excecute SQL statement
    $result = mysqli_query($link,$sql);

    // die if SQL statement failed
    if (!$result) {
      http_response_code(404);
      die(mysqli_error());
    }

    // print results, insert id or affected row count
    if ($method == 'GET') {
      if (!$key) echo '[';
      for ($i=0;$i<mysqli_num_rows($result);$i++) {
        echo ($i>0?',':'').json_encode(mysqli_fetch_object($result));
      }
      if (!$key) echo ']';
    } elseif ($method == 'POST') {
      echo mysqli_insert_id($link);
    } else {
      echo mysqli_affected_rows($link);
    }

    // close mysqli connection
    mysqli_close($link);
?>

我已经实现了RESTful API,现在我可以使用$http.get(url+customerId)接收JSON对象。这将返回我想要的JSON对象。查看上面的服务器代码,如果我想删除customerId 5的客户,我需要回拨什么电话呢?

我试过$http.delete(url+customerId).then() ...

但它似乎不起作用。需要帮助。

2 个答案:

答案 0 :(得分:1)

查看浏览器开发人员控制台以查看脚本返回的内容。 既然你说它返回500我就会认为PHP崩溃了。从我所看到的 mysqli_error错过了$link作为参数。但错误日志应该 包含详细信息。

您的脚本的一些提示:

  • 我会使用prepared statments代替mysqli_real_escape_string
  • 您可以使用json_encode函数始终返回正确的JSON 响应。即也许你可以简单地使用:json_encode($result->fetch_all(MYSQLI_ASSOC)) 在GET上输出响应。
  • 如果出现错误,我会返回500状态代码而不是404
  • 只有在条目不存在的情况下才应使用404 $result->field_count == 0
我也是Fusio的开发者,这是一个尝试简化的开源项目 在脚本中构建API。如果您愿意,可以查看: http://www.fusio-project.org/

答案 1 :(得分:0)

我使用了相同的脚本。

这里的问题是这行代码:

  case 'DELETE':
    $sql = "delete `$table` where id=$key"; break;

需要将其更新为以下代码:

  case 'DELETE':
    $sql = "delete FROM `$table` where id=$key"; break;

现在运行代码,它将工作。它对我有用。

以下是实际代码的链接:

https://www.leaseweb.com/labs/2015/10/creating-a-simple-rest-api-in-php/

谢谢,

切里安。