【问题标题】:Error 500 internal server error when sending post http request using Guzzle使用 Guzzle 发送 post http 请求时出现错误 500 内部服务器错误
【发布时间】:2017-12-02 13:36:30
【问题描述】:

我正在尝试使用 Guzzle 发送一个 post http 请求,但出现错误 500

Internal server error 
ServerException in RequestException.php line 113:
Server error: `POST https://domainname/api/v1/user/register` resulted in a `500 Internal Server Error` response:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="robots" content="noindex,nofo (truncated...)

我尝试使用 Postman 发送相同的标题和正文键,它没有任何问题:

{
    "status": "true"
}

标题: 身体:

这是我的 Guzzle 客户端请求:-

        $client = new GuzzleHttp\Client(['base_uri' => 'https://domainname/api/v1/']);
                   $response = $client->request('POST', 'user/register', [
                       'headers' => [
                           'Authorization' => Session::get('token'),
                           'Content-Type'     => 'application/x-www-form-urlencoded',
                       ],
                       'form_params' => [
                           'start_date' => $start_date,
                           'expiry_date' => $expiry_date,
                           'type' => 'normal',
                           'status' => 'active',

                       ]
                   ]);

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

我到那个 api 的路线:-

Route::post('/user/register', 'UsersAPI@register'); 

我的注册控制器:

public function register(Request $request){
Log::info('Request: ' . $request);
//dd($request->all());
     $validator = Validator::make($request->all(), [
        // 'user_id' => 'required',
        'start_date' => 'required',
        'expiry_date' => 'required',
        'type' => 'required',
        'status'=>'required',   
        //'receipt' => 'required',
        //'purchase_id'=>'required',
    ]);

    $user = JWTAuth::toUser(); 
      //Check whether validation is failed or passed
    if($validator->fails()){
        //Redirect back with validation errors
        return response()->json(['error' => $validator->errors()], 400);
    }



         $user = new User($data);
        $user->user()->save($user);
     Log::info('save_user done for this user: ' . $user->id);


    return ['status' => 'true']; 
}

NGINX 错误日志:-

[02/Dec/2017:15:49:13 +0300] "POST /api/v1/user/register HTTP/1.1" 500 16904 "-" "GuzzleHttp/6.2.1 curl/7.55.0 PHP/7.1.9"

【问题讨论】:

  • 在您的邮递员中,我可以看到您在“承载”和令牌本身之间缺少授权标头的空间。这样,看一下 Session::get('token') 的值。顺便说一句,错误 500 可能意味着任何事情。你需要深入并找出真正的问题。这个日志输出不是那么有用。
  • @Dusan 是的,你是对的,我只是尝试用 'string' 替换请求中的变量,它没有返回错误。

标签: php http http-post guzzle http-status-code-500


【解决方案1】:

如果相同的代码根据您发送请求的方式产生不同的结果,我会假设请求有效负载之间仍然存在差异。

您是否仔细检查过 Session::get('token')、$start_date 和 $expiry_date 的内容?

【讨论】:

  • 是的,你是对的,我只是尝试用 'string' 替换请求中的变量,它没有返回错误。问题在于 $dates 而不是 session('token') 我会尝试找出问题所在
  • 我有以下变量 $date ..... $start_date = Carbon::now(); $expiry_date = Carbon::now()->addDays(30);为什么他们会产生错误 500?
  • echo $start_date ==> 2017-12-02 14:16:16; echo $expiry_date ==> 2018-01-01 14:16:16
  • 通常 500 响应有一个可以以某种方式记录的根本原因。服务器日志说明控制器代码的位置是什么?由于控制器中没有明确输出 500 状态代码的代码,因此我假设引发了某种异常。如果您尚未在日志中看到确定性错误消息,请尝试将代码包装在 try...catch 块中,捕获所有 \Exception 实例并输出/记录异常消息。这应该会给你一个提示。
  • 这是一个奇怪的问题,当我只是将 'start_date' => $start_date, 'expiry_date' => $expiry_date, 替换为 'start_date' => '2017-12-1 14:06: 58','expiry_date' => '2017-12-20 14:06:58',请求工作没有任何问题,即使我使用从两个变量中获得的日期时间格式,关于我发布的错误 500 的日志我在 Nginx 服务器中得到了什么,请参阅我的主要问题帖子
最近更新 更多