Я использовал UnityWebRequest для вызовов REST через Unity, но для определенного проекта мне пришлось выбрать другой вариант и начать тестирование RestSharp для Unity (https://github.com/llamazoo/RestSharp-for-unity3d).
Приложение содержит множество APIвызовов, поэтому я создал один статический класс со статическим IEnumerator для отправки запросов и выполнения обратного вызова к классу monobehaviour, который запустил сопрограмму.
Есть несколько методов, которые запускают сопрограмму запроса API, получаютотвечает и выполняет обратный вызов, который снова запускает другую сопрограмму того же IEnumerator. Все это хорошо работает с UnityWebRequests.
Я попытался сделать то же самое с RestSharp, добавив выход в Async Execute запроса API.Первый вызов API (скажем, для конечной точки-1) работает хорошо, получает ответ и выполняет обратный вызов с данными из конечной точки-1 в качестве параметра. Метод обратного вызова форматирует данные и вызывает тот же RestSharp IEnumarator с новыми данными для конечной точки-2. Здесьстатический метод выходит из метода так же, как и сопрограмма.(Который допускает только один вызов API с ответом в секунду)
Ниже приведен мой статический класс
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RestSharp;
using System.Net;
public static class RestSharpUtil
{
public static IEnumerator request_routine_POST(string url,string json, System.Action<string> callback, System.Action<string> failCallback=null){
Debug.Log("Request : "+json);
RestClient w = new RestClient(url);
RestRequest request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
request.Parameters.Clear();
request.AddParameter("application/json", json, ParameterType.RequestBody);
yield return w.ExecuteAsync(request,(response,AsyncHandler)=> {
if(response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.Accepted){
Debug.Log("Success!-> " + response.Content);
callback(response.Content);
Debug.Log("After Request");
}else{
LoadingPanel.ShowError("Something went wrong, Try again!");
}
});
Debug.Log("Action Complete");
}
}
А ниже приведены мои методы (основной и обратный вызов)
public void test(){
string customerdata= "json1";
StartCoroutine(RestSharpUtil.request_routine_POST(endpoint-1, customerdata, OnResponse));
}
void OnResponse(string res){
string otherdata = "some processed data with res";
StartCoroutine(RestSharpUtil.request_routine_POST(endpoint-2, otherdata, OnResponse2));
}
OnResponse2 - это просто пустой метод для отображения содержимого.Однако выполнение сопрограммы в OnResponse
печатает предыдущий запрос, а не новый.
Мой результат:
Request : json1
Action Complete
Success -> response
Success -> response
Он никогда не печатает «Действие завершено» или «После запроса».».Что я тут не так делаю?