【问题标题】:How to get the JSON content of a HTTP Post request?如何获取 HTTP Post 请求的 JSON 内容?
【发布时间】:2021-12-10 21:34:34
【问题描述】:

我想将一个 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);
            }
        }

如果我使用 Laravel 发送 UnityWebRequest 将发送成功响应,但是,打印的数组(见下文)只是空的。 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-&gt;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"
}

我错过了什么?如果您需要更多信息,请告诉我。

【问题讨论】:

  • 那么在 Unity 中执行此操作时究竟发生了什么?您可以为此添加收到的输出吗?还请添加您将 json data 传递给方法的具体方式和内容
  • @derHugo 感谢您的评论!我添加了如何传递和序列化数据的代码。当我用$request-&gt;getContent() 打印收到的请求时,我可以看到我的数据实际上在这里,即使我的数组是空的!!
  • 请补充:OfferData 是什么。您的 JSON 在 Unity (Debug.Log(JsonUtility.ToJson(data, true));) 中的外观如何?
  • @derHugo 我添加了 JSON

标签: c# json laravel http unity3d


【解决方案1】:

Sebastian Feistl 的回答是适合我的方法,但不是将整个请求的“Content-Type”设置为“application/json”,而是仅在我为 uploadHandler 设置时才有效:

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

在使用 Postman 进行实验时,我发现“Content-Length”标头对于这个请求也是必要的(至少在我的情况下),我认为 uploadHandler 在这方面也有帮助,因为它以字节为单位设置内容,因此长度也是如此。不过,这只是猜测。

【讨论】:

    【解决方案2】:

    UnityWebRequest.Post 发送urlencoded 之类的数据

    1. uri 表单数据将被传输到的目标 URI。
    2. postData 表单正文数据。将在传输前进行URLEncoded

    您应该需要使用 php.ini 中的urldecode 方法对内容进行解码。喜欢

    $decoded = urldecode($request);
    

    将 json 解析为对象:

    $data = json_decode($decoded);
    

    获取json的属性。

    $data->{attribute};
    

    【讨论】:

    • 恐怕这对我不起作用。另外我认为这没有必要,因为 Laravel 应该能够自己检测到 json。使用 Postman 可以正常工作...
    • 也许对你有帮助。 stackoverflow.com/questions/59404046/…
    【解决方案3】:

    我仍然不确定为什么它不能开箱即用,但我想出了如何解决这个问题。

    将原始上传处理程序添加到 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 正确解析。

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2019-02-15
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多