#c#
Вопрос:
У меня есть функция C# unity, и я пытаюсь запросить некоторый json с веб-сервера, но по какой-то причине он не выходит из функции там, где я хочу:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Proyecto26;
using UnityEditor;
using UnityEngine.Networking;
using System.Text;
using TMPro;
using SimpleJSON;
public class APIRequest
{
// string basicRequestPage = "****";
string basicAPI_Key = "****";
// Start is called before the first frame update
string outputs;
public string basicRequest(int requestTyp)
{
auth test1 = new auth();
test1.key = basicAPI_Key;
switch (requestTyp)
{
case 0:
test1.request = "deckList";
break;
case 1:
test1.request = "card";
break;
}
string output = JsonConvert.SerializeObject(test1);
byte[] outputToServer = Encoding.ASCII.GetBytes(output); ;
//Debug.Log(output);
RestClient.Request(new RequestHelper
{
Uri = basicRequestPage,
Method = "POST",
Timeout = 10,
//EnableDebug = true,
ParseResponseBody = false, //Don't encode and parse downloaded data as JSONe
BodyRaw = outputToServer
}).Then(response =>
{
// EditorUtility.DisplayDialog("Status", response.Text, "Ok");
var rest = response.Text;
//Debug.Log(rest);
outputs = rest.ToString();
//EditorUtility.DisplayDialog("Status", outputs, "Ok");
return outputs;
}).Catch(err =>
{
var error = err as RequestException;
EditorUtility.DisplayDialog("Error Response", error.Response "", "Ok");
}
);
}
}
Ссылка на код, потому что он не будет работать со встроенным текстом кода
Это прекрасно работает как метод, но продолжает жаловаться, что у меня нет действительного возврата от функции. Когда я пытаюсь вернуть значение, которое я получаю от API, а именно переменную outputs, она говорит, что она равна нулю. Я попытался поместить его в функцию, в общедоступную переменную. но пока безрезультатно.
Есть какие-нибудь идеи?
Комментарии:
1. В
).Catch( err => ...
блоке либо создайте исключение , либоreturn "";
Функция в любом случае должна что-то возвращать. Не просто счастливый путь.2. Предложение: добавьте регистр по умолчанию в инструкцию switch
Ответ №1:
Вы определили вывод типа string
, однако вы не возвращаете строку при всех выходах. После catch
этого вы должны вернуть строку либо в конце метода, либо в catch
. Последняя строка, которую я добавил return "";
, должна решить проблему.
public string basicRequest(int requestTyp)
{
auth test1 = new auth();
test1.key = basicAPI_Key;
switch (requestTyp)
{
case 0:
test1.request = "deckList";
break;
case 1:
test1.request = "card";
break;
}
string output = JsonConvert.SerializeObject(test1);
byte[] outputToServer = Encoding.ASCII.GetBytes(output);
//Debug.Log(output);
RestClient.Request(new RequestHelper
{
Uri = basicRequestPage,
Method = "POST",
Timeout = 10,
//EnableDebug = true,
ParseResponseBody = false, //Don't encode and parse downloaded data as JSONe
BodyRaw = outputToServer
}).Then(response =>
{
// EditorUtility.DisplayDialog("Status", response.Text, "Ok");
var rest = response.Text;
//Debug.Log(rest);
outputs = rest.ToString();
//EditorUtility.DisplayDialog("Status", outputs, "Ok");
return outputs;
}).Catch(err =>
{
var error = err as RequestException;
EditorUtility.DisplayDialog("Error Response", error.Response "", "Ok");
}
);
return ""; //<----- this here
}
Комментарии:
1. Хотя я вижу, что получаю ответ с помощью DisplayDialog, когда я добавляю то, что вы предложили, единственная строка, которую я получаю, -«», похоже, она обходит возврат, который я ввел ранее в коде.
2. добавление в catch только по-прежнему говорит, что «у вас нет действительного возврата»
3. @danielrobbins вы указываете в заголовке метода, что возвращаете строку. Таким образом, все пути выхода в методе должны определять возврат. Я предполагаю, что компилятор видит другие пути выхода, поэтому добавление возвращаемого значения «» в конце метода, как показано, должно решить эту проблему. Возврат в конце не обходит введенный вами возврат, ваш возврат никогда не будет достигнут, так как метод вернется тогда, а это означает, что вы никогда не окажетесь в . Затем расстанься. Попробуйте добавить туда точку останова и отладить, она, вероятно, не будет поражена.
4. Я добавил точку останова, и она действительно попала в возврат в функции ответа. Я верю. По какой-то причине кажется, что сначала выполняется нижний возврат, затем правильный возврат, и именно поэтому я получаю нулевое значение. Может быть, это потому, что он не ждет ответа первым?