从 MVC POST 操作方法调用 Web API 并接收结果
Call to Web API from MVC POST action method and receive a result
我正在尝试从 MVC POST 操作方法调用 Web API 并接收结果但不确定如何接收结果,例如:
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> MyList = new List<string> { m.Value1,
m.Value2, m.Value3, m.Value4};
return Redirect???? // Redirct to web APi POST
// Assume this would be a GET?
return Redirect("http://localhost:41174/api/values")
}
我想把上面的MyList传到Web上Api进行处理,然后它会传一个结果(int)给原来的controller:
// POST api/values
public int Post([FromBody]List<string> value)
{
// Process MyList
// Return int back to original MVC conroller
}
不知道如何进行,感谢任何帮助。
您的 Web API 控制器本身不应该做太多事情。在具有适当的关注点分离的应用程序中,您的处理应该在其他地方完成。例如:
这可能在您的域模型中。
public class StringUtilities
{
//Just a representative method of one way of processing the strings
public int CountSomeStrings(IEnumerable<string> strings)
{
return strings.Count();
}
}
您网站的一部分API
// POST api/values
public int Post([FromBody]List<string> value)
{
return StringUtilities.CountSomeStrings(value);
}
然后在您的 MVC 控制器中调用,无需调用 Web API。直接调用它调用的方法即可。
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> MyList = new List<string> { m.Value1,
m.Value2, m.Value3, m.Value4};
int NumStrings = StringUtilities.CountSomeStrings(MyList);
ViewBag["NumStrings"] = NumStrings;
return View();
}
您不应该使用 POST、a redirect almost always uses GET 进行重定向,但无论如何您都不想重定向到 API:浏览器将如何处理响应?
您必须执行 POST from your MVC controller and return the data。
像这样:
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> postData = new List<string> { m.Value1, m.Value2, m.Value3, m.Value4 };
using (var client = new HttpClient())
{
// Assuming the API is in the same web application.
string baseUrl = HttpContext.Current
.Request
.Url
.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped);
client.BaseAddress = new Uri(baseUrl);
int result = client.PostAsync("/api/values",
postData,
new JsonMediaTypeFormatter())
.Result
.Content
.ReadAsAsync<int>()
.Result;
// add to viewmodel
var model = new ViewModel
{
intValue = result
};
return View(model);
}
}
在 Controller 中使用它
public async Task<ActionResult> EmployeeRegister(CreateEmployee model)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8082/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Clear();
HttpResponseMessage response = await client.PostAsJsonAsync("api/CreateEmployee/PostEmployee", model);
if (response.IsSuccessStatusCode == true)
{
return View();
}
return View();
}
我正在尝试从 MVC POST 操作方法调用 Web API 并接收结果但不确定如何接收结果,例如:
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> MyList = new List<string> { m.Value1,
m.Value2, m.Value3, m.Value4};
return Redirect???? // Redirct to web APi POST
// Assume this would be a GET?
return Redirect("http://localhost:41174/api/values")
}
我想把上面的MyList传到Web上Api进行处理,然后它会传一个结果(int)给原来的controller:
// POST api/values
public int Post([FromBody]List<string> value)
{
// Process MyList
// Return int back to original MVC conroller
}
不知道如何进行,感谢任何帮助。
您的 Web API 控制器本身不应该做太多事情。在具有适当的关注点分离的应用程序中,您的处理应该在其他地方完成。例如:
这可能在您的域模型中。
public class StringUtilities
{
//Just a representative method of one way of processing the strings
public int CountSomeStrings(IEnumerable<string> strings)
{
return strings.Count();
}
}
您网站的一部分API
// POST api/values
public int Post([FromBody]List<string> value)
{
return StringUtilities.CountSomeStrings(value);
}
然后在您的 MVC 控制器中调用,无需调用 Web API。直接调用它调用的方法即可。
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> MyList = new List<string> { m.Value1,
m.Value2, m.Value3, m.Value4};
int NumStrings = StringUtilities.CountSomeStrings(MyList);
ViewBag["NumStrings"] = NumStrings;
return View();
}
您不应该使用 POST、a redirect almost always uses GET 进行重定向,但无论如何您都不想重定向到 API:浏览器将如何处理响应?
您必须执行 POST from your MVC controller and return the data。
像这样:
[HttpPost]
public ActionResult Submit(Model m)
{
// Get the posted form values and add to list using model binding
IList<string> postData = new List<string> { m.Value1, m.Value2, m.Value3, m.Value4 };
using (var client = new HttpClient())
{
// Assuming the API is in the same web application.
string baseUrl = HttpContext.Current
.Request
.Url
.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped);
client.BaseAddress = new Uri(baseUrl);
int result = client.PostAsync("/api/values",
postData,
new JsonMediaTypeFormatter())
.Result
.Content
.ReadAsAsync<int>()
.Result;
// add to viewmodel
var model = new ViewModel
{
intValue = result
};
return View(model);
}
}
在 Controller 中使用它
public async Task<ActionResult> EmployeeRegister(CreateEmployee model)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8082/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Clear();
HttpResponseMessage response = await client.PostAsJsonAsync("api/CreateEmployee/PostEmployee", model);
if (response.IsSuccessStatusCode == true)
{
return View();
}
return View();
}