当前位置: 首页 > 知识库问答 >
问题:

与邮递员一起将多部分/数据投递到Cakephp

仰翔
2023-03-14

这是我尝试用以下代码发送到api文件夹中的pictures控制器的数据:

  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')为true。当我尝试使用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
   }
 }

编辑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--
'

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

共有1个答案

孟和玉
2023-03-14

cake没有设置$this->request->data的原因是请求后体是以JSON格式编码的。

根据CakePHP文档:

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

// Get JSON encoded data submitted to a PUT/POST action
$data = $this->request->input('json_decode');
 类似资料:
  • 我创建了一个简单的Web API项目,我正试图用邮递员软件发布数据,但有些东西不起作用... 我的web api控制器的名称是ValuesController。 我的数据如下所示: 当我将Post方法修改为: 我收到邮递员的“坏请求”信息

  • 如何使用POSTMAN对具有自定义头的多部分/表单数据进行测试,以2个文件为参数的控制器()?

  • 我试图从某个客户端向rails服务器发送POST请求,但遇到了一些问题。完整的要求是发送一个图像,用回形针处理,但它看起来像是一个带有Rails问题的普通邮递员多部分邮件。 我假设问题在于请求参数没有封装在“categories”中。请让我知道,如果我不够清楚,如果我可以提供更多的信息。 提前谢谢。 但我还是得到了同样的结果

  • 我和邮递员一起看了用cookie发送请求的手册: 由于打包的应用程序运行在与浏览器分开的沙箱中,因此无法访问浏览器内部设置的cookie。使用拦截器扩展也可以克服这个限制。Postman通过拦截器路由所有请求,然后拦截器使用浏览器上下文发送请求。浏览器内部设置的Cookie将自动附加到您的请求。阅读关于拦截器的博文原文。 一旦拦截器启用,您也可以从邮递员发送cookie。只需设置“cookie”头

  • 在我的Laravel应用程序中,我需要定期使用Guzzle将数据发送到API。 API使用承载令牌进行身份验证,并请求和接受原始JSON。为了进行测试,我使用Postman访问了API,一切都工作得很好。

  • 我正在尝试设置邮递员预请求,以便在向服务发出每个请求之前获取 OAuth 令牌。 我尝试遵循与此相关的各种示例和指南,每个示例和指南似乎都非常简单,尽管由于预请求脚本失败,我的脚本仍然存在问题。 恐怕这在某种程度上与这样一个事实有关,即我需要调用的endpoint来获取令牌是在超文本传输协议上,而不是在https上,因为在Postman控制台中,我总是收到对同一个url的两个单独的请求,一个在ht