UnityWebRequest 通过Post方式发起网络请求

举报
CoderZ1010 发表于 2022/09/25 06:37:29 2022/09/25
【摘要】 以实际工作中与后端人员对接接口为例,下图为后端人员提供的需要对接的某个接口:     可见数据结构中包含了4个string类型的字段,首先定义数据结构,注意字段名和字段类型需要保持一致,否则导致无法正确解析数据。 /// <summary> /// 确认过闸 /// </summary...

以实际工作中与后端人员对接接口为例,下图为后端人员提供的需要对接的某个接口:    

可见数据结构中包含了4个string类型的字段,首先定义数据结构,注意字段名和字段类型需要保持一致,否则导致无法正确解析数据。

/// <summary>
/// 确认过闸
/// </summary>
[Serializable]
public class Affirm
{
    public string id;
    public string inId;
    public string time;
    public string batchCode;
}

Serializable特性表示该类可序列化,否则无法进行序列化

    设置请求头header的Content-Type,它有四种类型:

        application/x-www-form-urlencoded(默认)  

        application/xml

        application/json

        multipart/form-data

由于该接口所传的参数为json格式,所以需要设置为application/json,否则导致报错:HTTP/1.1 415 Unsupported Media Type,下面封装发起网络请求的携程函数:

public IEnumerator SendWebRequest()
{
    //接口地址
    string url = "http://**.**.***.***:****/********/*****";
    //post数据 通过序列化获得字符串
    string postData = JsonMapper.ToJson(new Affirm());
    //Post网络请求
    using (UnityWebRequest request = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST))
    {
        byte[] postBytes = Encoding.UTF8.GetBytes(postData);
        request.uploadHandler = new UploadHandlerRaw(postBytes);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
        if (!request.isNetworkError && !request.isHttpError)
        {
            Debug.Log(response);
        }
        else
        {
            Debug.LogError($"发起网络请求失败: 确认过闸接口 -{request.error}");
        }
    }
}

当后端返回数据时,通过反序列化得到我们所需的Response类

[Serializable]
public class AffirmResponse
{
    public string msg;
    public int code;
    public bool hit;
    public List<Affirm> data;
}
public IEnumerator SendWebRequest()
{
    //接口地址
    string url = "http://**.**.***.***:****/********/*****";
    //post数据 通过序列化获得字符串
    string postData = JsonMapper.ToJson(new Affirm());
    //Post网络请求
    using (UnityWebRequest request = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST))
    {
        byte[] postBytes = Encoding.UTF8.GetBytes(postData);
        request.uploadHandler = new UploadHandlerRaw(postBytes);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
        if (!request.isNetworkError && !request.isHttpError)
        {
            //反序列化
            var response = JsonMapper.ToObject<AffirmResponse>(request.downloadHandler.text);
            Debug.Log($"Code:{response.code}  Msg:{response.msg}  Hit:{response.hit}");
        }
        else
        {
            Debug.LogError($"发起网络请求失败: 确认过闸接口 -{request.error}");
        }
    }
}

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/120865914

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。