【问题标题】:Does Luracast Restler support multipart/form-data format?Luracast Restler 是否支持多部分/表单数据格式?
【发布时间】:2011-12-15 08:50:07
【问题描述】:

我有一个示例 Restler 类:

   class Author {
      ....

      function post($request_data=NULL) {
         var_dump($request_data);
         var_dump($_FILES);
         var_dump($_REQUEST);

         return $this->dp->insert($this->_validate($request_data));
       }

      ....
  }

我正在尝试通过简单的 HTML 表单将文件和一些数据发布到 Restler 服务:

  <FORM action="http://host/index.php/author" enctype="application/x-www-form-urlencoded" method="post">
      Name:  <INPUT type="text" name="name" value="dima"><BR>
      Email: <INPUT type="text" name="email" value="dima@prot.lt"><BR>
      File:  <INPUT type="file" name="files"><BR> 
      <INPUT type="submit" value="Send"> <INPUT type="reset">
  </FORM>

很明显,$_FILES 数组将为空,但 $_REQUEST$request_data 将包含三个变量: name = "dima"email = "dima@prot.lt"file = "selected file name"

在接下来的测试中,我将表单 enctype 值更改为 multipart/form-data。

  <FORM action="http://host/index.php/author" enctype="multipart/form-data" method="post">
      Name:  <INPUT type="text" name="name" value="dima"><BR>
      Email: <INPUT type="text" name="email" value="dima@proto.lt"><BR>
      File:  <INPUT type="file" name="files"><BR> 
      <INPUT type="submit" value="Send"> <INPUT type="reset">
  </FORM>

当我按下提交表单时,在$_REQUEST 数组中,我会看到相同的三个变量,$_FILES 数组将填充上传的文件信息,但是$request_data 数组将为空!!

在这种情况下有人可以帮忙吗?我哪里做错了?

【问题讨论】:

    标签: php json api rest post


    【解决方案1】:

    我已经解决了这个问题,通过写Restler插件,可能其他人也会有同样的问题:

    <?php
    
    /**
     * URL Encoded String in multipart data format
     * @category   Framework
     * @author     Dmitrij Orlov <dmitrij.orlov@gmail.com>
    */
    class UrlMultipartFormat implements iFormat
    {
        const REQUEST_MIME      = 'multipart/form-data';
        const RESPONCE_MIME     = 'application/json';
        const EXTENSION         = 'post';
    
        public function getMIMEMap() {
            return array(self::EXTENSION=>self::REQUEST_MIME);
        }
    
        public function getMIME(){
            return self::RESPONCE_MIME;
        }
    
        public function getExtension(){
            return self::EXTENSION;
        }
    
        public function setMIME($mime){
            //do nothing
        }
    
        public function setExtension($extension){
            //do nothing
        }
    
        public function encode($data, $human_readable=FALSE){
            return $human_readable ? 
            $this->json_format(json_encode(object_to_array($data))) : 
            json_encode(object_to_array($data));
        }
    
        public function decode($data){
            return $_REQUEST;
        }
    
        public function __toString(){
            return $this->getExtension();
        }
    
        /**
         * Pretty print JSON string
         * @param string $json
         * @return string formated json
         */
        private function json_format($json)
        {
            $tab = "  ";
            $new_json = "";
            $indent_level = 0;
            $in_string = FALSE;
    
            $len = strlen($json);
    
            for($c = 0; $c < $len; $c++) {
                $char = $json[$c];
                switch($char) {
                    case '{':
                    case '[':
                        if(!$in_string) {
                            $new_json .= $char . "\n" . 
                            str_repeat($tab, $indent_level+1);
                            $indent_level++;
                        } else {
                            $new_json .= $char;
                        }
                        break;
                    case '}':
                    case ']':
                        if(!$in_string) {
                            $indent_level--;
                            $new_json .= "\n".str_repeat($tab, $indent_level).$char;
                        } else {
                            $new_json .= $char;
                        }
                        break;
                    case ',':
                        if(!$in_string) {
                            $new_json .= ",\n" . str_repeat($tab, $indent_level);
                        } else {
                            $new_json .= $char;
                        }
                        break;
                    case ':':
                        if(!$in_string) {
                            $new_json .= ": ";
                        } else {
                            $new_json .= $char;
                        }
                        break;
                    case '"':
                        if($c==0){
                            $in_string = TRUE;
                        }elseif($c > 0 && $json[$c-1] != '\\') {
                            $in_string = !$in_string;
                        }
                    default:
                        $new_json .= $char;
                        break;
                }
            }
    
            return $new_json;
        }
    
    }
    
    ?>
    

    【讨论】:

    • 阅读 Restler 问题页面中的this thread 了解更多详情
    【解决方案2】:

    Restler v2.1 及更低版本不支持multipart/form-data,因为我们专注于 API 创建。但我们对想法持开放态度,并会考虑将其添加到未来的版本中。

    在您的函数中直接使用$_REQUEST$_FILES 没有任何问题,目前这是获取数据的唯一选择

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 2011-12-15
      • 2013-03-10
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多