如何从http客户端项目调用API控制器

本文关键字:调用 API 控制器 项目 客户端 http | 更新日期: 2023-09-27 18:03:34

我有五个项目:

  • 学生。BBL(类库)
  • 学生。DAL(类库)
  • 学生。WEB (MVC项目)
  • 学生。客户端(类库,在WeB和API之间)
  • 学生。API

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

我不知道如何写一个正确的URL。URL如下:

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;
        }

private string Base_URL = "http://localhost:56543/api/";

如何从http客户端项目调用API控制器

从上面的评论中:

  • Api层:public IHttpActionResult GetStudent(int id) {stRepository.GetStById(id);返回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路由配置。

如果您的控制器名称是"country",则尝试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。

但是我强烈建议你在国家控制器上设置学生控制器来获取学生详细信息