C# вернуть строку из анонимной стрелочной функции - PullRequest
0 голосов
/ 21 июня 2020

Привет, друзья stackoverflowers,

Итак, я работаю с данными fecthing из REST API и пытаюсь создать строковый объект, который выполняет операцию вызова, называемую GetUserRequests (), я хочу, чтобы он возвращал данные из конечная точка.

Это код для него

private string GetUserRequests()
        {
            string comments = string.Empty;
            webrequest.Enqueue("https://coolrestapiendpoint.com/stuff", null, (code, response) =>
            {
                // Catch errors before anything funny happens
                if (response == null) { LogError($"[GetUserRequests] Failed to GET webrequest\nCode: {code}\nResponse:{response}"); return; }
                if (DEBUG) { Puts($"[GetUserRequests] Response:\n{response}\n"); }

                switch (code)
                {
                    case 200:
                            comments += $"stuff parsed from the endpoint";
                        break;
                    case 500:
                        break;
                    default:
                        LogError($"[GetUserRequests] Unexpected webrequest response\nCode: {code}\nResponse:{response}"); return;
                }

            }, this, RequestMethod.GET, Headers);
            return comments;
        }

Это код для его вызова:

Console.WriteLine(GetUserRequests());

Он возвращает пустую строку ... не Данные REST API Я предполагаю, что это потому, что объект «комментарии» не заполняется, пока функция не будет обработана.

Как мне подойти к этому подходящим образом?

Спасибо за все советы

1 Ответ

0 голосов
/ 21 июня 2020

Вы возвращаете comments до того, как данные приходят с сервера. Поэтому необходимо подождать этого.

Используйте этот метод для ожидания WebRequest

private async Task<(string response, string code)> MakeRequestAsync(string url)
{    
    var responseText = await Task.Run(() =>
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            WebResponse response = request.GetResponse();            
            Stream responseStream = response.GetResponseStream();
            return (new StreamReader(responseStream).ReadToEnd(), response.StatusCode.ToString());            
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
        return null;
    });

    return responseText;
}

Затем вы можете переписать свой код как

private async Task<string> GetUserRequests()
        {
            var (code, response) = await MakeRequestAsync("https://coolrestapiendpoint.com/stuff");
            
            // Catch errors before anything funny happens
            if (response == null) { LogError($"[GetUserRequests] Failed to GET webrequest\nCode: {code}\nResponse:{response}"); return; }
            if (DEBUG) { Puts($"[GetUserRequests] Response:\n{response}\n"); }

            switch (code)
            {
                case 200:
                    return $"stuff parsed from the endpoint";
                case 500:
                    return string.Empty;
                default:
                    LogError($"[GetUserRequests] Unexpected webrequest response\nCode: {code}\nResponse:{response}");
                    return string.Empty;
            }
        }
Console.WriteLine(await GetUserRequests());
...