【问题标题】:Why $request is empty when I send post request to Laravel from C# App?当我从 C# App 向 Laravel 发送 post 请求时,为什么 $request 为空?
【发布时间】:2021-07-02 13:10:30
【问题描述】:

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


这是我发送发布请求的 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($request)?看看它有什么?
  • 是的,我想检查 $request 对象的所有属性。
  • 您可以使用xdebug,但您必须进行设置。这比json_encodeing 好多了,试试看!
  • 我正在从另一个不在 laravel 项目中的应用程序中检查它,就像在这种情况下,我试图查看我从我的 c# 客户端应用程序发送到服务器的 $request 是什么

标签: c# laravel post laravel-request


【解决方案1】:

json_encodeing $request(或request())不显示-(私有)或#(受保护)属性,仅显示+(公共)。请参阅此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},
}

如您所见,在终端访问中,它只显示+(公共)属性。与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,但由于大多数属性都是#(受保护)或-(私有),因此会删除很多属性。即使这样,对于显示的属性,唯一的嵌套属性是#parameters,它受到保护,因此被剥离。

所以,json_encode(request()) 产生正确的JSON

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

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2019-07-10
    • 2020-06-26
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多