簡體   English   中英

如何獲取 HTTP Post 請求的 JSON 內容?

[英]How to get the JSON content of a HTTP Post request?

我想將 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
}

RequestHandler 中的 post 函數:

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());
}

使用 Postman 時會產生預期的結果:

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

使用 Unity 發送具有相同 JSON 的類似請求:

array ()

當我使用$request->getContent()我實際上可以看到我的數據。 為什么數組是空的?

請求頭成功

從 Postman 發送時的請求標頭:

{
"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"
}

我錯過了什么? 如果您需要更多信息,請告訴我。

UnityWebRequest.Post發送urlencoded數據,如

  1. uri表單數據將傳輸到的目標 URI。
  2. postData表單主體數據。 將在傳輸之前進行URLEncoded

您應該需要在 php 中使用urldecode方法解碼內容。 喜歡

$decoded = urldecode($request);

將 json 解析為對象:

$data = json_decode($decoded);

獲取json的屬性。

$data->{attribute};

我仍然不確定為什么它不能開箱即用,但我想出了如何解決這個問題。

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();

Laravel 現在可以正確解析 JSON 數據。

Sebastian Feistl 的回答是適合我的方法,但不是將整個請求的“Content-Type”設置為“application/json”,它只有在我為 uploadHandler 設置時才有效:

webRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));
webRequest.uploadHandler.contentType = "application/json";

嘗試 Postman,我發現“Content-Length”標頭對於這個請求也是必要的(至少在我的情況下),我認為 uploadHandler 在這方面也有幫助,因為它以字節為單位設置內容,因此長度也是如此。 不過,這只是猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM