[英]How to get the JSON content of a HTTP Post request?
我想將 JSON 文件從我的 Unity 應用程序發送到我的 Laravel 后端。 我的帖子請求似乎有問題,但我無法弄清楚它是什么。
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 進行編碼。
這是在我的控制器函數中訪問 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
數據,如
uri
表單數據將傳輸到的目標 URI。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.