大佬看看用的这个模板 OssSinkConnector只有python版本的代码 我用u[阿里云函数计算]

大佬看看用的这个模板 OssSinkConnector只有python版本的代码 我用unity c#不知道该传什么参数 变量名改多少 调用接口报这个错 WWW Error:502 Bad Gateway:{ “errorMessage”: “the JSON object must be str, bytes or bytearray, not ‘dict'”, “errorType”: “TypeError”, “stackTrace”: [ [ “File “/var/fc/runtime/python3/bootstrap.py””, “line 543”, “in wsgi_wrapper”, “body = request_handler(environ, start_response)” ], [ “File “/code/index.py””, “line 98”, “in handler”, “evt = json.loads(event)” ], [ “File “/var/fc/lang/python3/lib/python3.6/json/init.py””, “line 348”, “in loads”, “‘not {!r}’.format(s.class.name))” ] ] }

the JSON object must be str, bytes or bytearray, not ‘dict'”

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
3 条回复 A 作者 M 管理员
  1. 根据错误提示,可以看出对于该函数计算 Python 函数的事件参数 event,需要是一个 JSON 字符串类型的数据,而不是 Python 的 dict 类型。因此,你需要在 Unity C# 代码中将传递给该 Python 函数的参数转化为 JSON 字符串类型格式进行传递。

    具体来说,你可以使用 Newtonsoft.Json 库将 C# 对象序列化为 JSON 字符串后作为参数传递给 Python 函数。例如,在 Unity C# 代码中,可以使用如下方式来进行 JSON 格式化:

    using UnityEngine;using Newtonsoft.Json;public class TestFunctionCompute : MonoBehaviour{    void Start()    {        // 将对象序列化为 JSON 字符串        var data = new { key1 = "value1", key2 = 123 };        string json = JsonConvert.SerializeObject(data);        // 调用 Python 函数        StartCoroutine(PostRequest(json));    }    IEnumerator PostRequest(string json)    {        // 设置 HTTP 请求参数        WWWForm form = new WWWForm();        form.AddField("event", json);        // 发送 HTTP POST 请求        using (var www = new WWW("<函数计算 Python 函数 URL>", form))        {            yield return www;            if (!string.IsNullOrEmpty(www.error))            {                Debug.LogError("WWW Error: " + www.error);            }            else            {                Debug.Log("WWW Response: " + www.text);            }        }    }}

    其中,JsonConvert.SerializeObject 方法将一个对象转化为 JSON 字符串,并在 HTTP POST 请求中将其作为 event 参数传递给函数计算 Python 函数。注意在请求时需要指定正确的函数计算 Python 函数的 URL。

  2. 根据您的描述,您使用了 OssSinkConnector 模板,但是该模板只提供了 Python 版本的代码,您想用 Unity C# 来调用该接口,但是不知道应该传递哪些参数,以及如何修改变量名。同时,您尝试调用接口时遇到了 502 Bad Gateway 的错误,并且提示了 JSON 对象必须是字符串类型。

    关于参数的传递和变量名的修改,您需要先了解该接口的具体实现,看看 Python 代码中都做了哪些事情,需要传递哪些参数,以及这些参数的数据类型和名称。然后再将这些参数和名称应用到 C# 代码中。通常来说,变量名称可以根据您的需要进行修改,但是参数的数据类型和名称需要与 Python 代码保持一致。

    关于 502 Bad Gateway 的错误,可能是因为您传递的参数类型不正确,导致无法正确解析 JSON 对象。您可以尝试将参数转换为字符串类型,或者将参数序列化为 JSON 对象后再传递。另外,您还需要检查网络连接是否正常,以及接口地址是否正确。

    最后,建议您参考该接口的文档和 Python 代码,了解该接口的具体实现和参数要求,然后再将这些知识应用到 C# 代码中。如果还有问题,可以提供更多的信息,便于更好地帮助您解决问题。

  3. 不是参数名错了 调用的时候header加下类型试下吧 application/json

    此答案来自钉钉群“阿里函数计算官网客户”

  4. 根据您提供的错误信息,是因为传递给接口的参数类型不正确导致的。

    具体来说,接口期望接收 str、bytes 或者 bytearray 类型的 JSON 对象,但是接收到了 dict(字典)类型的对象,因此报错。

    因为您使用的是Unity C#,所以需要将参数转换为字符串类型,然后再传递给接口。可以尝试使用JsonUtility.ToJson()方法将对象序列化为JSON字符串,然后再将JSON字符串转换为bytes或者字符串类型,再传递给接口。

    例如:

    c# using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking;

    public class Test : MonoBehaviour { // 接口地址和参数定义 private string apiUrl = “https://your-api-endpoint-url”; private Dictionary postData = new Dictionary { { “name”, “test” }, { “age”, “20” } };

    IEnumerator Start(){    // 序列化post数据    string postJson = JsonUtility.ToJson(postData);    byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postJson);    // 构造请求    UnityWebRequest request = UnityWebRequest.Post(apiUrl, "");    request.uploadHandler = new UploadHandlerRaw(postBytes);    request.downloadHandler = new DownloadHandlerBuffer();    request.SetRequestHeader("Content-Type", "application/json");    // 发送请求    yield return request.SendWebRequest();    // 处理响应数据    if (request.result == UnityWebRequest.Result.Success)    {        string responseJson = request.downloadHandler.text;        Debug.Log(responseJson);    }    else    {        Debug.Log(request.error);    }}

    } 在上面的代码中,我使用了UnityWebRequest来构造请求并发送请求。首先,我将postData字典对象序列化为JSON字符串,然后将JSON字符串转换为bytes类型,并通过UploadHandlerRaw上传到服务器。需要注意的是,在上传数据之前,需要设置请求头Content-Type为application/json。

    总之,您只需要将postData字典中的变量名改为您实际使用的变量名,再将apiUrl替换为您自己的接口地址,就可以使用上面的代码来调用接口了。