Я пытаюсь отправить JSON
к моему rest-api
с помощью RestSharp
, По сути, я создал класс модели для JSON:
public class LogPostData
{
public string LogMessage { get; set; }
public string LogStackTrace { get; set; }
public string LogUserId { get; set; }
public string LogUserIp { get; set; }
}
поэтому я выполняю запрос следующим образом:
var logPost = new LogPostData();
logPost.LogMessage = "log message"logPost.LogStackTrace = "some content";
var post = JsonConvert.SerializeObject(logPost);
var client = new RestClient("url of rest api");
var request = new RestRequest("methodApi", Method.PUT);
request.RequestFormat = DataFormat.Json;
request.AddParameter("application/json; charset=utf-8", post, ParameterType.RequestBody);
request.RequestFormat = DataFormat.Json;
var response = client.Execute(request);
как вы можете видеть, я создал объект LogPostData
а затем сериализовал его с помощью JsonConvert.SerializeObject
,
Я позвонил methodApi
передавая в качестве параметра JSON.
Теперь, внутри моего API для отдыха, я сделал следующее:
file_put_contents('debug.txt', serialize($_POST));
содержимое должно быть переменной, с которой я отправил RestSharp
на post
переменная, вместо этого я получаю: a:0:{}
почему мой $_POST
переменная пуста?
Согласно Руководство по PHP, $_POST
работает с application/x-www-form-urlencoded
а также multipart/form-data
типы контента. Вы отправляете JSON (application/json
). поскольку $_POST
является ассоциативным массивом, созданным из опубликованных данных формы, и вы не публикуете форму, поэтому неудивительно, что она будет пустой.
Чтобы получить сырой JSON из тела запроса, вам нужно использовать php://input
$json = file_get_contents('php://input');
Для десериализации JSON объекта вы можете использовать json_decode
,
$logPostData = json_decode($json);
Если вы хотите, чтобы данные были преобразованы в ассоциативный массив, как $_POST
, вы можете пройти true
в качестве второго параметра:
$logPostData = json_decode($json, true);
Вот что вы отправляете (JSON):
header: encoding-type=application/json
body: {"param1":"I like horses", "param2":"they are cool"}
Это то, что нужно PHP в запросе POST для работы массива $ _POST (отправка формы)
header: encoding-type=application/x-www-form-urlencoded
body: param1=I%20like%20horses¶m2=they%20are%20cool
Если вы счастливы с отправкой JSON, вам нужно получить его правильно.
Если вы хотите продолжать использовать PUT, создайте для него обработчик, который ожидает JSON. (На основе этот ответ)
$method = $_SERVER['REQUEST_METHOD'];
if ('PUT' === $method) {
$data = json_decode(file_get_contents('php://input'), true);
var_dump($data); //$data contains put fields
}