为什么当我从 C# App 向 Laravel 发送 post 请求时 $request 为空?

Why $request is empty when I send post request to Laravel from C# App?

我正在尝试使用 c# 创建一个桌面应用程序,它将操作我的 Laravel 网站的数据库 (MySQL)。 所以我正在创建 API 路由来充当中间人。我实际上通过更改代码解决了我的问题,但不明白为什么它不能更早地工作。我是 Laravel 和 c# 的新手,编写一些东西只是为了学习一些东西。


这是我发送 post 请求的 C# 代码
  WebClient client = new WebClient();
        
  string postUrl = "http://mywebsite.com/api/v1/handshake";

  var reqparm = new System.Collections.Specialized.NameValueCollection();
  reqparm.Add("param1", "<any> kinds & of = ? strings");
  reqparm.Add("param2", "testing parameter two");

  byte[] response= client.UploadValues(postUrl, reqparm);
  string result = System.Text.Encoding.UTF8.GetString(response);
  MessageBox.Show(result);

这是我在 Laravel 中的路由(在中间件之外)

Route::prefix('v1')->group(function(){
  Route::post('handshake','Api\SomeController@handshake');
});

我很好奇的问题是当我的控制器是这样的时候:

  public function handshake(Request $request)
  {
    return json_encode($request);
  }

回复是:{"attributes":{},"request":{},"query":{},"server":{},"files":{},"cookies":{},"headers":{}}

当我将握手方式更改为:

  public function handshake(Request $request)
  {
    return json_encode($request->param2);
  }

回复是:"testing parameter two"


所以我想知道为什么我返回时响应是空的json_encode($response). Illuminate Request 是不是另一种类型的对象导致了这种情况,还是我遗漏了什么?如果你解释它不起作用的原因,这将非常有帮助

json_encodeing $request(或 request())不显示 -(私有)或 #(受保护)属性,仅 +(public)。请参阅此 php artisan tinker 示例:

>>> request()
=> Illuminate\Http\Request {#70
  +attributes: Symfony\Component\HttpFoundation\ParameterBag {#75},
  +request: Symfony\Component\HttpFoundation\ParameterBag {#72},
  +query: Symfony\Component\HttpFoundation\ParameterBag {#77},
  +server: Symfony\Component\HttpFoundation\ServerBag {#79},
  +files: Symfony\Component\HttpFoundation\FileBag {#73},
  +cookies: Symfony\Component\HttpFoundation\ParameterBag {#76},
  +headers: Symfony\Component\HttpFoundation\HeaderBag {#80},
}

如您所见,在终端访问中,它仅显示 + (public) 属性。与 dd(request()) 比较(显示 所有 属性,无论访问级别如何):

>>> dd(request())
Illuminate\Http\Request^ {#70
  #json: null
  #convertedFiles: null
  #userResolver: null
  #routeResolver: null
  +attributes: Symfony\Component\HttpFoundation\ParameterBag^ {#75
    #parameters: []
  }
  +request: Symfony\Component\HttpFoundation\ParameterBag^ {#72
    #parameters: []
  }
  +query: Symfony\Component\HttpFoundation\ParameterBag^ {#77
    #parameters: []
  }
  +server: Symfony\Component\HttpFoundation\ServerBag^ {#79
     #parameters: array:132 [...]
  }
  +files: Symfony\Component\HttpFoundation\FileBag^ {#73
    #parameters: []
  }
  +cookies: Symfony\Component\HttpFoundation\ParameterBag^ {#76
    #parameters: []
  }
  +headers: Symfony\Component\HttpFoundation\HeaderBag^ {#80
    #headers: array:5 [...]
  }
  #content: null
  #languages: null
  #charsets: null
  #encodings: null
  #acceptableContentTypes: null
  #pathInfo: null
  #requestUri: null
  #baseUrl: null
  #basePath: null
  #method: null
  #format: null
  #session: null
  #locale: null
  #defaultLocale: "en"
  -preferredFormat: null
  -isHostValid: true
  -isForwardedValid: true
  pathInfo: "/"
  requestUri: "/"
  baseUrl: ""
  basePath: ""
  method: "GET"
  format: "html"
}

因此,当您 运行 json_encode($request) 时,它会将 Illuminate\Http\Request 的实例转换为 json,但由于大多数属性都是 #(受保护)或 - (private),很多都被去掉了。即便如此,对于显示的属性,唯一嵌套的 属性 是 #parameters,它受到保护,因此被剥离。

因此,json_encode(request()) 生成正确的 JSON:

{"attributes":{},"request":{},"query":{},"server":{},"files":{},"cookies":{},"headers":{}}