如何从htttp客户端项目调用api控制器?

时间:2016-08-23 16:59:03

标签: c# asp.net-mvc asp.net-web-api

我有5个项目:

  • Students.BBL(班级图书馆)
  • Students.DAL(班级图书馆)
  • Students.WEB(MVC项目)
  • Students.Client(类库,WeB和API之间)
  • Students.API

如何通过客户端从WEB调用API控制器? 因为当我从客户端调用Home控制器(WEB)方法时,它会转到客户端,在这里我应该创建一个API请求。但....

我不知道如何撰写正确的网址。 像这样的网址:

http://localhost:56543/api/students/4 

不起作用,它会返回404错误。

代码:

public StudentDTO find(int id)
    {
        try
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(Base_URL);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = client.GetAsync("student/" + id.ToString()).Result;

            if (response.IsSuccessStatusCode)
                return response.Content.ReadAsAsync<CountryDTO>().Result;
            return null;
        }
        catch
        {
            return null;
        }

私人字符串Base_URL =&#34; http://localhost:56543/api/&#34 ;;

1 个答案:

答案 0 :(得分:0)

根据以上帖子中的这些评论:

  • Api层:public IHttpActionResult GetStudent(int id){stRepository.GetStById(id); return Ok(stRepository.GetStById(id)); }

  • “country”是Api Controller的名称

好像你的路线错了。 要解决您期望的路线 - http://localhost:56543/api/students/4,你应该有

  • ApiController名为StudentsController
  • 该控制器应具有一个且仅有一个 GET方法,该方法接受id作为参数 - GetSomeMethodName(int id)。在您的情况下,您有GetStudent(int id)。确保在该控制器中没有任何其他GET方法和此签名。这一点假设您已经修改了默认的wep api路由配置。

如果您的控制器名称是“国家/地区”,请尝试http://localhost:56543/api/country/4。 如果您在具有上述签名的国家/地区控制器中有多个GET操作,则会再次抛出此错误。

除非您显示api控制器代码,否则无法解决您的问题

如果您还想使用国家/地区控制器,并且您在该控制器中有多个GET方法,那么我会建议属性路由。

在web api配置中,添加:

config.MapHttpAttributeRoutes();

在您的api控制器操作中

[HttpGet]
[Route("~api/students/{id}")]
public IHttpActionResult GetStudent(int id) 
{  
    stRepository.GetStById(id); 
     return Ok(stRepository.GetStById(id));
 }

通过上述配置,您将在路径http://localhost:56543/api/students/4中获得学习详细信息 - 在保持API项目运行后尝试从浏览器中访问此URL。

但我强烈建议您让学生控制器代替国家控制器获取学生详细信息