Unity学习笔记之WebGL端网页接口接入

这里仅记录个人接入的方式,仅作为个人笔记!

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

public class AccessWebAPI : MonoBehaviour
{
    private void Start()
    {
        GetTicketFromServer();
    }

    #region 获取ticket的值
    [DllImport("__Internal")]
    private static extern string StringReturnValueFunction();

    public static string UrlMsg = string.Empty;
    public static string ticket;

    /// <summary>
    /// token的值
    /// </summary>
    static string token;
    public void GetTicketFromServer()
    {
        //从URL解析出Ticket
        UrlMsg = StringReturnValueFunction();
        string[] s = UrlMsg.Split('&');
        for (int i = 0; i < s.Length; i++)
        {
            //Debug.Log(s[i]);
            if (s[i].Contains("ticket"))
                ticket = s[i].Substring(7);
        }
        Debug.Log("ticket = " + ticket);
        //ticket = "ThFk5m8smvCJYrpOdwL%2FW17%2B9QJTdJ3WDwVysYz%2BcTi5iLhQlJEMicVLg3Q1NvC5sYiPlOvXe2StVdahKAnF6dPw72BRPlyIIwio0BB%2FPYiRgJs8OWk%2B%2Fr3QPB2i9qPS";
        //GetTokenFormServerByTicket(transform.name, "SetToken", ticket);
        StartCoroutine(GetTokenFromServerByTicket(ticket, GetTokenFromServerSuccess));

        //Debug.Log("token = " + data);
        //GetTokenByTicket(GetTokenFormServerByTicket(ticket));
    }
    #endregion

    #region 获取token
    //[DllImport("__Internal")]
    //private static extern string GetTokenFormServerByTicket(string objName, string methodName, string ticket);
    public void GetTokenFromServerSuccess(string value)
    {
        Debug.Log("resInfo = " + value);

        LoginSuccessJSON obj = JsonUtility.FromJson<LoginSuccessJSON>(value);
        if (obj.code == 200 && obj.message == "操作成功")
        {
            token = obj.data;
        }
        else
        {
            //如果未获取到Token,则用测试账户去再次获取
            StartCoroutine(LoginToServerByTestAccount(OnTestAccountLoginSuccessCallback));
        }

    }
    /// <summary>
    /// 获取Token
    /// </summary>
    /// <param name="ticket"></param>
    /// <param name="callback"></param>
    /// <returns></returns>
    private static IEnumerator GetTokenFromServerByTicket(string ticket, Action<string> callback)
    {
        string url = "https://***.******.com:****/***/login/loginILab";//服务器上获取token的地址,这里不方便透露

        //Debug.Log("data=" + data);
        WWWForm form = new WWWForm();
        form.AddField("ticket", ticket);

        using (UnityWebRequest webRequest = UnityWebRequest.Post(url, form))
        {
            webRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
                Debug.LogError(webRequest.error);
            else if (callback != null)
                callback.Invoke(webRequest.downloadHandler.text);
        }
    }
    #endregion

    #region 登录到服务器

    /// <summary>
    /// 测试账户登录成功
    /// </summary>
    /// <param name="value"></param>
    private static void OnTestAccountLoginSuccessCallback(string value)
    {
        Debug.Log("TestAccountCallback:" + value);
        LoginSuccessJSON obj = JsonUtility.FromJson<LoginSuccessJSON>(value);
        token = obj.data;
        Debug.Log("TestAccountToken:"+token);
    }
    /// <summary>
    /// 登录到服务器
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="callback"></param>
    /// <returns></returns>
    private static IEnumerator LoginToServerByTestAccount(Action<string> callback)
    {
        string url = "https://***.******.com:****/mtq/login/login";
        string testAccountInfo = "{\"account\": \"admin\",\"password\": \"******\",\"time\": 0}";

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(testAccountInfo);
            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.SetRequestHeader("Content-Type", "application/json");
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
                Debug.LogError(webRequest.error);
            else if (callback != null)
                callback.Invoke(webRequest.downloadHandler.text);
        }
    }
    #endregion

    #region 上传分数
    /// <summary>
    /// 上传分数(外部调用)
    /// </summary>
    /// <param name="value"></param>
    public void ShangChuanScore(string answer, float score, float time, int topicId)
    {
        this.answer = answer;
        this.score = score;
        this.time = time;
        this.topicId = topicId;

        StartCoroutine(UploadScoreCoroutine(ShangChuan));
    }
    private void ShangChuan(string value)
    {
        Debug.Log(value);
    }
    private string answer;
    private float score;
    private float time;
    private int topicId;
    string data_ShangChuan;

    /// <summary>
    /// 上传分数
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="callback"></param>
    /// <returns></returns>
    private IEnumerator UploadScoreCoroutine(Action<string> callback)
    {
        string url = "https://***.******.com:****/***/studentTopic/uploadStudentAnswer";//

        data_ShangChuan = "{\"answer\":\"" + answer + "\",\"score\":" + score + ",\"time\":" + time + ",\"topicId\":" + topicId + "}";
        Debug.Log(data_ShangChuan);
        //string data = "{\"account\": \"admin\",\"password\": \"123456\",\"time\": 0}";

        Dictionary<string, string> requestHeader = new Dictionary<string, string>();  //  header
                                                                                      //http header 的内容
        requestHeader.Add("Content-Type", "application/json");
        requestHeader.Add("token", token);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(data_ShangChuan);
            //设置header
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
            }

            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
                Debug.LogError(webRequest.error);
            else if (callback != null)
                callback.Invoke(webRequest.downloadHandler.text);
        }
    }
    #endregion

    #region 查询分数
    private int id;
    /// <summary>
    /// 查询分数(外部调用)
    /// </summary>
    /// <param name="id"></param>
    public void QueryScore(int id)
    {
        this.id = id;
        StartCoroutine(SeeScoreCoroutine(See));
    }
    public void See(string value)
    {
        Debug.Log(value);
    }
    /// <summary>
    /// 查询分数
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="callback"></param>
    /// <returns></returns>
    private IEnumerator SeeScoreCoroutine(Action<string> callback)
    {
        string url = "https://***.******.com:****/***/topic/" + id;
        //string data = "{\"account\": \"admin\",\"password\": \"******\",\"time\": 0}";

        Dictionary<string, string> requestHeader = new Dictionary<string, string>();  //  header
                                                                                      //http header 的内容
        requestHeader.Add("Content-Type", "application/json");
        requestHeader.Add("token", token);

        using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(data_ShangChuan);
            //设置header
            foreach (var v in requestHeader)
            {
                webRequest.SetRequestHeader(v.Key, v.Value);
            }

            webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
            webRequest.SetRequestHeader("Content-Type", "application/json");
            webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
                Debug.LogError(webRequest.error);
            else if (callback != null)
                callback.Invoke(webRequest.downloadHandler.text);
        }
    }
    #endregion

}

[Serializable]
public class LoginSuccessJSON
{
    public int code;
    public string message;
    public string data;
}

然后就是js文件内容了:

//My.jslib		//这个是当前js的文件名
var MyPlugin = {
      
    StringReturnValueFunction: function()//获取当前网页的地址
    {
        var returnStr = window.location.search;
        var buffer = _malloc(lengthBytesUTF8(returnStr) + 1);
        stringToUTF8(returnStr, buffer,lengthBytesUTF8(returnStr) + 1);
        return buffer;
    }, 

    GetTokenFormServerByTicket:function(objectName,methodName,ticketStr)//获取token
    {
        var objName = Pointer_stringify(objectName);
        var mtdName = Pointer_stringify(methodName);
        var str = Pointer_stringify(ticketStr);
        var data = str;
        var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.addEventListener("readystatechange", function() {
            if(this.readyState === 4) {
                // var returnStr = this.responseText;
                // var bufferSize = lengthBytesUTF8(returnStr) + 1;
                // var buffer = _malloc(bufferSize);
                // stringToUTF8(returnStr, buffer, bufferSize);
                //console.log(this.responseText);
                SendMessage(objName,mtdName,this.responseText);

            }});
        xhr.open("POST", "https://***.******.com:****/***/login/loginILab");
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(data);

    }
};
 
mergeInto(LibraryManager.library, MyPlugin);

内容就这么多了。
对了,这个是全是用的post的方式去进行的。
在线HTTP POST/GET … 接口测试工具
这工具真好用,也可以装一个专门的软件Postman

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值