为什么当我从 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_encode
ing $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":{}}
我正在尝试使用 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_encode
ing $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":{}}