UnityWebRequest HTTP POST для облачных функций для Firebase

У меня возникли проблемы с отправкой POST Http-запроса в мой проект облачных функций firebase из игрового движка Unity3D.

Я получаю ответ с кодом 400, а в консоли firebase вижу следующую ошибку:

Ошибка: недопустимый json при синтаксическом разборе

У меня действительно мало знаний о Http-запросах, и, после некоторого времени, пытающегося найти решение, я хотел бы попросить о помощи.

Вот код клиента:

public void RateLevel(string guid, int rating)
{
    RateLevelRequest rlr = new RateLevelRequest (guid, rating.ToString());
    string body = rlr.ToJson ();
    UnityWebRequest www = UnityWebRequest.Post("myurl", body);
    www.SetRequestHeader ("Content-Type", "application/json");
    StartCoroutine (MakeRequest (www));
}

/* * * * * * * * * * * * * * * * * * * 
 * AUXILIAR CLASS FOR HTTP REQUESTS  *
 * * * * * * * * * * * * * * * * * * */

[System.Serializable]
public class RateLevelRequest
{
    public string guid;
    public string rating;

    public RateLevelRequest(string _guid, string _rating)
    {
        guid = _guid;
        rating = _rating;
    }

    public string ToJson()
    {
        string json = JsonUtility.ToJson (this);
        Debug.Log ("RateLevelRequest Json: " + json);
        return json;
    }
}

Я могу гарантировать, что json правильно сформирован с такими значениями.

{"guid": "fake-guid", "rating": "- 1"}

А вот моя текущая развернутая функция в firebase-functions.

exports.rate_level = functions.https.onRequest((req, res) => {
    if(req.method === 'POST')
    {
        console.log('guid: ' + req.body.guid);
        console.log('rating: ' + req.body.rating);
        console.log('invented var: ' + req.body.myinvention);

        if(req.body.guid && req.body.rating &&
        (req.body.rating == 1 || req.body.rating == -1))
        {
            res.status(200).send('You are doing a post request with the right fields and values');
        }
        else
        {
            res.status(403).send('Required Fields are not Defined!')
        }
    }
    else
    {
        res.status(403).send('Wrong Request Method!');
    }
});

Кто-нибудь пробовал это и преуспел раньше?

Заранее спасибо!


person Carles    schedule 25.04.2017    source источник


Ответы (1)


Хорошо, я нашел ответ в отличная запись в блоге.

Я действительно не знаю, что было не так, но вместо этого я заменил свой код на тот, который указан в упомянутой выше статье, который работает. Я отправлю его для остальных, у кого возникнут проблемы.

    public void RateLevel(string guid, int rating)
    {
        RateLevelRequest rlr = new RateLevelRequest (guid, rating.ToString());
        string body = rlr.ToJson ();
        byte[] bodyRaw = new System.Text.UTF8Encoding ().GetBytes (body);
        UnityWebRequest www = new UnityWebRequest("myurl", UnityWebRequest.kHttpVerbPOST);
        www.uploadHandler = (UploadHandler)new UploadHandlerRaw (bodyRaw);
        www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
        www.SetRequestHeader ("Content-Type", "application/json");
        StartCoroutine (MakeRequest (www));
    }

Лучший!

person Carles    schedule 25.04.2017