Как получить содержимое JSON запроса HTTP Post? - PullRequest
0 голосов
/ 23 января 2020

Я хочу отправить файл JSON из моего приложения Unity на мой Laravel бэкэнд. Кажется, что-то не так с моим почтовым запросом, но я не могу понять, что это такое.

Отправка запроса с использованием Unity

public void SendRequest()
        {
            // serializable struct
            OfferData data = new OfferData(OfferSize.JUMBO, OfferType.AD, 50, 10);

            StartCoroutine(RequestHandler.Post(API_URL + "shop/store", JsonUtility.ToJson(data), (response) =>
            {
                if (response == null)
                {
                    return;
                }
                // success
                Debug.Log(response);
            }));
        }

JSON:

{
"size":3,
"type":1,
"gold":50,
"gems":10
}

Функция post в RequestHandler:

public static IEnumerator Post(string uri, string data, Action<string> response)
        {
            UnityWebRequest webRequest = UnityWebRequest.Post(uri, data);
            webRequest.SetRequestHeader("Content-Type", "application/json");

            yield return webRequest.SendWebRequest();

            if (webRequest.isNetworkError)
            {
                Error(webRequest.error);
                response(null);
            }
            else
            {
                response(webRequest.downloadHandler.text);
            }
        }

Если я отправляю UnityWebRequest с Laravel, то отправит успешный ответ, однако, напечатанный массив ( смотри ниже) просто пусто. Laravel не может закодировать JSON.

Получение запроса в Laravel

Вот где запрос HTTP Post обрабатывается в функции моего контроллера:

public function store(Request $request)
{
    Log::debug($request->json()->all());
}

Что дает ожидаемый результат при использовании Почтальона:

array ('size' => 3, 'type' => 1, 'gold' => 50, 'gems' => 10)

Отправка аналогичного запроса с тем же JSON с использованием Unity:

array ()

Когда я использую $request->getContent() Я действительно могу увидеть свои данные. Почему массив пуст?

Успешный заголовок запроса

Заголовок запроса при отправке из Почтальона:

{
"content-type": "application/json",
"user-agent": "PostmanRuntime/7.21.0",
"accept": "*/*",
"cache-control": "no-cache",
"postman-token": "d8f323fc-f2c8-49b8-a023-2955122fa20e",
"host": "127.0.0.1:8000",
"accept-encoding": "gzip, deflate",
"content-length": "119",
"cookie": "XSRF-TOKEN=eyJpdiI6IkRyU1RqSkppcVdyUmpuVHI2Ym55XC9RPT0iLCJ2YWx1ZSI6ImQrc1QrOTcyWE1GSXM3SGQrVlBsTG1lZ0dXd1FCQlRPellTQm83Z0FkWFc0UktjUW9PNHRqS3B3Z2Rya1ZZS2IiLCJtYWMiOiIxMmNlZTFiODc2MTlmNmVhYjI3ZGI1MTQ1NTM2MGFjODQ4YjZhNzdlMmM4NWQwM2NiYzk1MjkzYzNiYjBmNTA5In0%3D; recludo_session=eyJpdiI6ImFLcUdCdU1WU2JzazNEaEFyaGoxbnc9PSIsInZhbHVlIjoiT1VtNzl4XC9HMW5reTdKUGNDdlBXMVdLK3hMNFR3Q2JxMzA1RVY3NWdVdmV5akJhbnBKeU9YdU5JSmdPdGYyNWUiLCJtYWMiOiI4MWJjOGVhMTcxNDI3M2VjNTU0MDc3NmNkZDU0NjZlMzhmYWI1MjRlZGNlZjhhNGEyNmNjMmY3YThiMzAyODNhIn0%3D",
"connection": "keep-alive"
}

Неправильный заголовок запроса

Заголовок запроса при отправке из Unity:

{
"host": "127.0.0.1:8000",
"user-agent": "UnityPlayer/2019.2.8f1 (UnityWebRequest/1.0, libcurl/7.52.0-DEV)",
"accept": "*/*",
"accept-encoding": "deflate, gzip",
"cookie": "XSRF-TOKEN=eyJpdiI6IlJhZE52emU1Z3hYUnVOWmtMbEdZa0E9PSIsInZhbHVlIjoibkdabkhZVnM1ZUYwSklvMzYrSHVLQ0Q5Y2NvRlVTMEhJOHpqMGFCSEZLZVQwd2NnT3NrUmNrXC9cL2Z4XC92M0J0QSIsIm1hYyI6Ijg4ZDUwZDQ4MWQ3OWM3ZjNlOTcxOWE3NzMxYjI1MmQ3NGQ2YzgwMWQ2MDE2YTQ5NTI3NWQ3MTg2ODM4NjMxY2UifQ%3D%3D; recludo_session=eyJpdiI6InoyMktDN3ByR1hYR0tHWCtvdmhOckE9PSIsInZhbHVlIjoiamZJVnlDbVYwZkdBU1wvMXhMeG1sWU5LdDY0d0NnQ0VucE1OK05UNDhUOG1Ya2o5ZUJIcFdaSktuakcrQjJqN1QiLCJtYWMiOiI1YTc5YTE5NDNhNjY5NWRlYzlmMDlkOGIyMWRiYTAzYzMwZTkwNzAzYjBhNTA2OGViOTUyOTlkYzMzYWJlMjA3In0%3D",
"content-type": "application/json",
"x-unity-version": "2019.2.8f1",
"content-length": "215"
}

Что мне не хватает? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Я все еще не уверен, почему это не работает "из коробки", но я выяснил, как решить эту проблему.

Добавить обработчик необработанной загрузки в UnityWebRequest :

UnityWebRequest webRequest = UnityWebRequest.Post(uri, data);

// Fix: Add upload handler and pass json as bytes array
webRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));

webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();

Данные JSON теперь могут быть правильно обработаны с помощью Laravel.

0 голосов
/ 23 января 2020

UnityWebRequest.Post отправка urlencoded данных типа

  1. uri Целевой URI, на который будут передаваться данные формы.
  2. postData Форма тела данных. Перед передачей будет URLEncoded .

Вам необходимо декодировать содержимое, используя метод urldecode в php. Например,

$decoded = urldecode($request);

для анализа json объекта:

$data = json_decode($decoded);

для получения атрибута json.

$data->{attribute};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...