【问题标题】:API returning 400 Bad Request responseAPI 返回 400 错误请求响应
【发布时间】:2017-02-17 11:57:23
【问题描述】:

我已经构建了一个 API 和一个使用该 API 的应用程序。一切正常,但现在,由于某种原因,我收到了 400 Bad Request 响应。我不确定我是否更改了代码中的某些内容,因此我想仔细检查它是否正确。

所以我的 API 调用是这样的

$client = new GuzzleHttp\Client();

$jsonData = json_encode($data);

$req = $client->request('POST', 'https://someurl.com/api/v1/createProject', [
    'body' => $jsonData,
    'headers' => [
        'Content-Type' => 'application/json',
        'Content-Length' => strlen($jsonData),
    ]
]);

$output = $req->getBody()->getContents();

API 有一个正确设置的使用 post 的路由。它调用的函数是正确的,我已经将它更改为测试以简单地返回

return response()->json(["Success", 200]);

当我在 Postman 中测试 API 时,我可以看到成功返回。当我在我构建的其他应用程序中测试 API 时,我什至在控制台中都没有看到 POST 请求,我只是显示了一个 Laravel 错误 400 Bad Request。

这个问题的原因可能是什么?

谢谢

更新

我已经把请求改成了这个

$data= json_encode($data);

$req = $client->post('https://someurl.com/api/v1/createProject', [
    'body' => $data
]);

如果我在编码后输出$data,我会得到这样的结果

{
    "projectName":"New Project",
    "clientName":"Test Client",
}

在被调用的 API 的控制器函数中,我只是这样做

return response()->json(['name' => $request->input('clientName')]);

400 错误现在已经消失,但我现在返回 null

{#326 ▼
  +"name": null
}

请求被注入到函数中。我应该以不同的方式返回数据吗?

谢谢

【问题讨论】:

  • 你使用 git 还是其他 vcs?如果你这样做了,你可以看看你是否做了改变......
  • 我没有对这部分代码进行任何更改,它曾经可以正常工作
  • 据我所知,您所做的只是尝试使用第一个代码 sn-p (Guzzle) 访问返回(测试)“成功”的路线。
  • 可能是应用程序发送了格式错误的 JSON。
  • 尝试$request->all() 而不是$request->input('clientName') 并反馈

标签: api laravel laravel-5.2


【解决方案1】:

可能你做了$ composer update 和 Guzzle 更新。

因此,如果您使用最新的 Guzzle (guzzlehttp/guzzle (6.2.2)),请执行 POST 请求:

$client = new GuzzleHttp\Client();

$data = ['name' => 'Agent Smith'];

$response = $client->post('http://example.dev/neo', [
    'json' => $data
]);

不需要指定标题。

要阅读回复,请执行以下操作:

$json_response = json_decode($response->getBody());

我的完整示例(在路由文件 web.php routes.php

Route::get('smith', function () {
    $client = new GuzzleHttp\Client();

    $data = ['name' => 'Agent Smith']; 

    $response = $client->post('http://example.dev/neo', [
        'json' => $data,
    ]);

    $code = $response->getStatusCode();
    $result = json_decode($response->getBody());

    dd($code, $result);
});

    Route::post('neo', function (\Illuminate\Http\Request $request) {
        return response()->json(['name' => $request->input('name')]);
    });

或者您可以使用以下(缩短),但上面的代码“更短”

$json_data = json_encode(['name' => 'Agent Smith']);

$response = $client->post('http://example.dev/neo', [
    'body' => $json_data,
    'headers' => [
        'Content-Type' => 'application/json',
        'Content-Length' => strlen($json_data),
    ]
]);

注意:如果您正在运行 PHP5.6,请将 php.ini 中的 always_populate_raw_post_data 更改为 -1(或取消注释该行)并重新启动服务器。阅读更多here

【讨论】:

  • @kate_hudson 查看更新,它按预期工作,我删除了更新前的完整示例并将其替换为新示例。从头开始阅读答案。
【解决方案2】:

在我的情况下,我在 BASE_URL 中使用公共 IP 地址,而我应该使用私有 IP。在 mac 上,您可以通过进入系统偏好设置 -> 网络来获取您的 IP。

这是使用 Android + Laravel (API)

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多