Rest 将多部分/数据与邮递员一起发送到Cakephp

Rest 将多部分/数据与邮递员一起发送到Cakephp,rest,cakephp-3.0,postman,Rest,Cakephp 3.0,Postman,我目前正在CakePHP3中构建一个RESTful API。我正试图通过Postman chrome扩展中的表单数据上传一个文件(包含一些附加数据)。但是,我不确定如何获得通过请求接收的数据 这是我试图用以下代码发送到api文件夹中的pictures controller的数据: public function add(){ debug($this->request->data); $picture = $this->Pictures->newEnt

我目前正在CakePHP3中构建一个RESTful API。我正试图通过Postman chrome扩展中的表单数据上传一个文件(包含一些附加数据)。但是,我不确定如何获得通过请求接收的数据

这是我试图用以下代码发送到api文件夹中的pictures controller的数据:

  public function add(){
    debug($this->request->data);
    $picture = $this->Pictures->newEntity($this->request->data);
    if ($this->Pictures->save($picture)) {
        $message = 'Saved';
    } else {
        $message = 'Error';
    }
    $this->set([
        'message' => $message,
        'picture' => $picture,
        '_serialize' => ['message', 'picture']
    ]);
   }
这会抛出一个数据库错误,表示我违反了外键约束(我认为这是因为
$This->request->data
为空)。但是,我只想查看发布的数据的外观,但是当我尝试使用
debug()
函数输出数据时,
$this->request->data
不会显示出来。我试着发布一个JSON主体,它实际上可以工作。我的问题是如何获取控制器中通过表单数据发送的数据

编辑 我确实设法输出了请求数据,该数据确实为空,但
$this->request is('post')
为真。当我尝试使用
debug()
输出
$this->request
时,我得到以下信息:

object(Cake\Network\Request) {
params => [
    'plugin' => null,
    'controller' => 'Pictures',
    'action' => 'add',
    '_ext' => null,
    'pass' => [],
    'prefix' => 'api',
    'isAjax' => false
]
data => null
query => []
cookies => []
url => 'api/pictures/add'
base => ''
webroot => '/'
here => '/api/pictures/add'
trustProxy => false
[protected] _environment => [
    'USER' => 'www-data',
    'HOME' => '/var/www',
    'FCGI_ROLE' => 'RESPONDER',
    'QUERY_STRING' => '',
    'REQUEST_METHOD' => 'POST',
    'CONTENT_TYPE' => 'multipart/form-data',
    'CONTENT_LENGTH' => '375',
    'SCRIPT_NAME' => '/index.php',
    'REQUEST_URI' => '/api/pictures/add',
    'DOCUMENT_URI' => '/index.php',
    'DOCUMENT_ROOT' => '/home/vagrant/Apps/vecto.app/webroot',
    'SERVER_PROTOCOL' => 'HTTP/1.1',
    'GATEWAY_INTERFACE' => 'CGI/1.1',
    'SERVER_SOFTWARE' => 'nginx/1.7.9',
    'REMOTE_ADDR' => '10.33.10.1',
    'REMOTE_PORT' => '55842',
    'SERVER_ADDR' => '10.33.10.10',
    'SERVER_PORT' => '80',
    'SERVER_NAME' => 'vecto.app',
    'REDIRECT_STATUS' => '200',
    'SCRIPT_FILENAME' => '/home/vagrant/Apps/vecto.app/webroot/index.php',
    'HTTP_HOST' => 'vecto.app',
    'HTTP_CONNECTION' => 'keep-alive',
    'HTTP_CONTENT_LENGTH' => '375',
    'HTTP_ACCEPT' => 'multipart/form-data',
    'HTTP_POSTMAN_TOKEN' => 'be1a629c-d81e-b19b-4e0f-294a46779150',
    'HTTP_CACHE_CONTROL' => 'no-cache',
    'HTTP_ORIGIN' => 'chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop',
    'HTTP_AUTHORIZATION' => 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjksImV4cCI6MTQ1NzYyOTU3NH0.NnjXWEQCno3PUiwHhnUCBjiknR-NlmT42oPLA5KhuYo',
    'HTTP_USER_AGENT' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
    'HTTP_CONTENT_TYPE' => 'multipart/form-data',
    'HTTP_DNT' => '1',
    'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
    'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8,nl;q=0.6',
    'PHP_SELF' => '/index.php',
    'REQUEST_TIME_FLOAT' => (float) 1457090949.1208,
    'REQUEST_TIME' => (int) 1457090949,
    'HTTP_X_HTTP_METHOD_OVERRIDE' => null,
    'ORIGINAL_REQUEST_METHOD' => 'POST',
    'HTTPS' => false,
    'HTTP_X_REQUESTED_WITH' => null
]
[protected] _detectors => [
    'get' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'GET'
    ],
    'post' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'POST'
    ],
    'put' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'PUT'
    ],
    'patch' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'PATCH'
    ],
    'delete' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'DELETE'
    ],
    'head' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'HEAD'
    ],
    'options' => [
        'env' => 'REQUEST_METHOD',
        'value' => 'OPTIONS'
    ],
    'ssl' => [
        'env' => 'HTTPS',
        'options' => [
            (int) 0 => (int) 1,
            (int) 1 => 'on'
        ]
    ],
    'ajax' => [
        'env' => 'HTTP_X_REQUESTED_WITH',
        'value' => 'XMLHttpRequest'
    ],
    'flash' => [
        'env' => 'HTTP_USER_AGENT',
        'pattern' => '/^(Shockwave|Adobe) Flash/'
    ],
    'requested' => [
        'param' => 'requested',
        'value' => (int) 1
    ],
    'json' => object(Closure) {

    },
    'xml' => object(Closure) {

    },
    'mobile' => object(Closure) {

    },
    'tablet' => object(Closure) {

    },
    'api' => object(Closure) {

    }
]
[protected] _detectorCache => [
    'json' => false,
    'xml' => false,
    'api' => false,
    'post' => true,
    'ajax' => false
]
[protected] _input => '------WebKitFormBoundaryRDGaZEhAuN4lILOR
Content-Disposition: form-data; name="album_id"

 2
  ------WebKitFormBoundaryRDGaZEhAuN4lILOR
  Content-Disposition: form-data; name="description"

  haiahaahahahdaisdhisadhisadihsdhiiahsd
  ------WebKitFormBoundaryRDGaZEhAuN4lILOR
  Content-Disposition: form-data; name="favorite"

  true
  ------WebKitFormBoundaryRDGaZEhAuN4lILOR--
  '
   [protected] _session => object(Cake\Network\Session) {
      [protected] _engine => null
      [protected] _started => null
      [protected] _lifetime => '1440'
      [protected] _isCLI => false
   }
 }
有人知道我做错了什么吗?看起来我收到的是文本值,但不是同时发送的文件。除此之外,我还不知道如何获得像专辑id和描述这样的数据

编辑2 当我用debug()输出$this->request->input()(不带json_decode)时,我得到以下输出:

'------WebKitFormBoundarykeFhH2KM4LdYgsH0
Content-Disposition: form-data; name="album_id"

2
------WebKitFormBoundarykeFhH2KM4LdYgsH0
Content-Disposition: form-data; name="description"

haiahaahahahdaisdhisadhisadihsdhiiahsd
------WebKitFormBoundarykeFhH2KM4LdYgsH0
Content-Disposition: form-data; name="favorite"

true
------WebKitFormBoundarykeFhH2KM4LdYgsH0--
'

我现在的问题是,如何获得通过相同请求发送的文件?(最后一个边界似乎是空的)

cake之所以没有设置
$this->request->data
,是因为POST请求主体以JSON格式编码

应用程序通常在非URL编码的帖子正文中交换数据。您可以使用Network\Request::input()读取任何格式的输入数据。通过提供解码功能,您可以接收反序列化格式的内容:


$data
现在应该包含邮递员提交的信息。

我终于找到了解决方案,通过调用debug($this->request->input())(不使用json_decode)。问题是当文件非常大时邮递员会冻结(首先我尝试上传一个pdf文档)。邮递员不适合输出整个文件。我有以下标题和正文:

当我尝试调用debug($This->request->input())时,它给出了以下输出:


据我所知。。。你不想保存它吗?如果不想保存,则不必调用
save()
函数。我想保存它,但需要一些额外的逻辑,即创建到AWS S3的链接。现在,我只想输出通过Postman中的表单数据发送的数据,但我不确定是否收到了这些数据,或者数据存储在哪个变量中。是否与此类似?我对邮递员一点也不熟悉:(顺便说一句:你好,达奇;))哈哈。我已经找到了那篇文章,但问题是,使用application/x-www-form-urlencoded,您无法发送任何文件。到目前为止,我没有找到任何解决办法。我已经尝试使用多部分/表单数据手动设置accept和content类型。这也不起作用,但我得到了一些附加信息(请参见编辑),而没有反序列化它将返回的信息格式,除了我也发送的文件(边界似乎为空)。此输入是否也包含该文件?我没有使用上载文件对其进行测试,也没有在烹饪书中找到与发送请求文件相关的任何内容,我建议您尝试一下,因为我现在无法测试它:/Sorry.No problem;)。如果我得到一个解决方案,我会发布它。现在,当我试图上传一个内容类型设置为multipart/form数据的文件时,Postman似乎被冻结了(如果我将内容类型泄露出去,那么cakephp不会收到正文)。也许最好使用cURL或类似的方法来执行测试。
// Get JSON encoded data submitted to a PUT/POST action
$data = $this->request->input('json_decode');
 public function add(){
     debug($this->request->input());
 }
'------WebKitFormBoundaryjQIb9c3vvKj8TzQ3
 Content-Disposition: form-data; name="album_id"

 2
 ------WebKitFormBoundaryjQIb9c3vvKj8TzQ3
 Content-Disposition: form-data; name="description"

  haiahaahahahdaisdhisadhisadihsdhiiahsd
  ------WebKitFormBoundaryjQIb9c3vvKj8TzQ3
  Content-Disposition: form-data; name="favorite"

  true
  ------WebKitFormBoundaryjQIb9c3vvKj8TzQ3
  Content-Disposition: form-data; name="uploadfile";          filename="test.txt"
  Content-Type: text/plain

  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do   eiusmod
  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim   veniam,
  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
  cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat   cupidatat non
  proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  ------WebKitFormBoundaryjQIb9c3vvKj8TzQ3--
  '