'Pass API response to another action

I have one API endpoint for login. Once we enter correct username and password then we are getting following details :

{
    "accessToken": "Some_Value",
    "accessTokenExpireAt": "Some_Value",
    "refreshToken": "Some_Value",
    "userID": "Some_Value"
}

Once user click on Submit button then below code will be executed.

public async Task<ActionResult> Index(LoginModel loginModel)
        {
            using (var client = new HttpClient())
            {
                string url = "URL_ENDPOINT_FOR_LOGIN";
                client.DefaultRequestHeaders.Accept.Clear();

                var response = await client.PostAsJsonAsync(url, loginModel);

                if (response.IsSuccessStatusCode)
                {
                    var result = response.Content.ReadAsStringAsync();

//Here I am getting all values in JSON in result. Now I want to redirect to user to profile page and on that page need to call another API which will fetch all details of that user. In Result I am getting userId.

                }
                else
                {
                    ModelState.AddModelError("", "Wrong details");
                }
            }
            return View(loginModel);
        }

Now I have one more API end point, when we call that then we are getting that user details like firstname, email id and so on.

I need to display that all user details in View, but only if that accessToken is coming.

So I want to know how I can pass this accessToken and userId to another action and all API url from there.



Solution 1:[1]

I did something similar before in a Web API.

Can you try this in your API method:

return RedirectToAction("RedirectedAction", 
    "ControllerName", 
    new { val = value1, ..., val = valueN });

Where value1, ... valueN are the parameters you pass onto the next API method.

The redirected method stub is then:

public async Task<ActionResult> RedirectedAction(
    string value1, string value2, ...)
{
    ...
}

(Adjust your parameter types as required.)

Solution 2:[2]

You can simply call by parameter and send json string to the action and in that action you can deserialize the Json string.

public async Task<ActionResult> Index(LoginModel loginModel)
    {
        using (var client = new HttpClient())
        {
            string url = "URL_ENDPOINT_FOR_LOGIN";
            client.DefaultRequestHeaders.Accept.Clear();

            var response = await client.PostAsJsonAsync(url, loginModel);

            if (response.IsSuccessStatusCode)
            {
                var result = response.Content.ReadAsStringAsync();
                string JsonString=result.Result;
                return RedirectToAction("YourAction", new { YourParam= JsonString });
            }
            else
            {
                ModelState.AddModelError("", "Wrong details");
            }
        }
        return View(loginModel);
    }

In the Other Action Your Can simply Deserialize using NewtonSoft.Json if not included you can download from nuget.

public ActionResult YourAction(string YourParam)
{
     YourClass clsObj= JsonConvert.DeserializeObject<YourClass>(JsonString /*YourParam in this case*/);
    // Do your Work Here
}

Also you can remove async task from your action to load your view after completing API request. Just add

System.Threading.Tasks.Task<HttpResponseMessage> response = client.PostAsJsonAsync(url, loginModel);
response.Wait();

in place of

var response = await client.PostAsJsonAsync(url, loginModel);

Also in action prototype

public ActionResult Index(LoginModel loginModel)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Andrew Halil
Solution 2 Ashfaque