Почему $request пуст, когда я отправляю почтовый запрос в Laravel из приложения C#?

Я пытаюсь создать настольное приложение с помощью С#, которое будет манипулировать базой данных моего веб-сайта Laravel (MySQL). Поэтому я создаю маршруты API, чтобы действовать как посредник. На самом деле я решил свою проблему, изменив код, но не понял, почему он не работал раньше. Я новичок как в Laravel, так и в С#, и кое-что кодирую, чтобы узнать кое-что.


This is my c# code to send a post request
  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 другим типом объекта, который вызывает это, или это что-то еще, что я упускаю? Будет очень полезно, если вы объясните причину, по которой это не сработало


person CS Student    schedule 06.04.2021    source источник
comment
Почему ты пытался json_encode($request) ? Чтобы посмотреть, что у него есть?   -  person matiaslauriti    schedule 06.04.2021
comment
Да, я хотел проверить все свойства объекта $request.   -  person CS Student    schedule 07.04.2021
comment
Вы можете использовать xdebug, но вы должны настроить его. Это намного лучше, чем что-то json_encode делать, попробуйте!   -  person matiaslauriti    schedule 07.04.2021
comment
Я проверяю это из другого приложения, не входящего в проект laravel, например, в этом случае я пытался увидеть, что такое запрос $, который я отправил на сервер из моего клиентского приложения С#.   -  person CS Student    schedule 08.04.2021


Ответы (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":{}}
person Tim Lewis    schedule 06.04.2021