【问题标题】:Laravel Post Request empty Request parametersLaravel Post Request 空请求参数
【发布时间】:2020-06-26 20:16:03
【问题描述】:

当我使用邮递员或我的应用程序发布到我的 API 端点时,request 参数是一个空数组。

与其他控制器发布请求工作正常,request 参数得到很好的处理。 只有使用我的订单控制器才能处理我的帖子正文。

我没有进行任何更改,恢复到较旧的提交也没有帮助。

我不知道为什么它不接受 JSON 正文。

控制器

public function createOrder(Request $request)
{
    return $request->product_id;
}

发布正文 | 原始 JSON

{
    "product_id": 4
}

响应 响应是一个空数组[]"

我已尝试打印 $request 并收到此回复

POST /api/order/post HTTP/1.1
Accept:          application/json
Accept-Encoding: gzip, deflate, br
Authorization:   Bearer.{token}
Cache-Control:   no-cache
Connection:      keep-alive
Content-Length:  20
Content-Type:    
Cookie:          XSRF-TOKEN={Token}%3D%3D; laravel_session=%3D%3D
Host:            backend.host
User-Agent:      PostmanRuntime/7.22.0
Cookie: XSRF-TOKEN==={token}; laravel_session={Token}

{
    "product_id": 4
}

我的帖子正文是可见的,所以我很困惑为什么它没有显示

我的期望和我得到的

我希望请求返回我的 JSON 正文的值

什么都不返回

注意:我最近添加了护照,但上次我在添加laravel后使用此端点时运行良好

工作控制器

public function store(Request $request)
{
    return $request;
}

API 路由

Route::post('order/create', 'OrderController@createOrder');
Route::post('product/create', 'ProductController@store');

如果我在控制器中执行echo $request,我会看到请求中有数据,但我认为格式不好:

POST /api/messages HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br
Authorization: Bearer 5|ibun75O2SNnZoT2W5Rk0KQox70wBxKN4xIIrq0sQ
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 522
Content-Type: application/json
Host: localhost:8000
User-Agent: PostmanRuntime/7.26.10

{
    "text" : "Molestiae dolor non eaque aut sapiente maiores. Aut voluptates nesciunt. Cum distinctio quisquam qui vitae eos
asperiores.

Nihil iste quia. Voluptate deleniti ipsam voluptas alias similique doloremque. Ratione alias iste voluptatem quis. Quis
quia quo sequi minus quod voluptate cum similique dolor.

Maxime enim aut. Eius ea doloribus. Quaerat dolor libero ipsum. Delectus atque esse ipsam est.",
    "imageLink" : "http://placeimg.com/640/480/abstract",
    "typeID" : "232",
    "answerTypeID" : "919"
}

【问题讨论】:

  • 您能否展示您的路线,以及实际可行的示例?
  • @Christoffer 已添加
  • 您是否检查过是否有中间件挡路?
  • @UdoE。我该如何检查?

标签: php laravel laravel-5 post


【解决方案1】:

检查您的请求是否:

  1. 添加标头Accept,其值为application/json
  2. 如果正文是 raw,请确保类型是 JSON
  3. 如果正文是原始,请确保内容是有效的 JSON,并且 不要在 JSON 中包含 cmets

例如:

这可行:JSON 类型的原始正文:

{
    "email": "{{email}}",
    "password": "{{password}}"
}

这不起作用:即使是 JSON 类型的原始正文:

{
    "email": "{{email}}", // Eg. superadmin@example.com <-- This invalidates the JSON
    "password": "{{password}}" // Eg. password <-- This invalidates the JSON
}

请注意,在 Postman 中,JSON cmets 在视觉/语法上呈现为 JSON 的有效部分,但实际上是无效的。

【讨论】:

    【解决方案2】:

    添加Content-Type:application/json 以使 PHP 了解它正在接收 JSON。目前,您的 Content-type 看起来是空的。还要确保您传递的 CSRF 令牌是正确的。

    【讨论】:

    • 除了@vivek_23 的正确答案之外,我发现我的请求的字符编码是正确的,但我的实际正文中包含对请求无效的字符。由于 Laravel 期望接收到的编码不同,因此(我认为)将正文转换为空字符串,这会导致请求正文为空。本质上,清理(如果手动构建;感觉检查)你的实际身体内容!
    猜你喜欢
    • 2019-07-23
    • 2015-12-24
    • 2020-02-27
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2021-07-02
    • 2019-04-04
    相关资源
    最近更新 更多