Web services 我想按其他条件搜索,而不是按id(WEB API)

Web services 我想按其他条件搜索,而不是按id(WEB API),web-services,rest,asp.net-web-api,Web Services,Rest,Asp.net Web Api,我是创建WEB API的初学者 我从数据库自动生成模型,然后为每个模型生成控制器,我的服务在默认设置下运行良好 例如: [ResponseType(typeof(student))] public IHttpActionResult Getstudent(int id) { student student = db.students.Find(id); if (student == null) { retur

我是创建WEB API的初学者

我从数据库自动生成模型,然后为每个模型生成控制器,我的服务在默认设置下运行良好

例如:

[ResponseType(typeof(student))]
    public IHttpActionResult Getstudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }
现在,当我使用以下命令调用它时: Localhost…/api/student/5
它返回正确的数据

问题是:我想通过其他方式搜索,而不是通过ID(主键),例如通过用户名和密码。 我搜索了很多,很多人都在谈论路由,新方法,是什么让我如此困惑,因为我是一个初学者。 如果有人能帮我,给我寄些教程或其他什么,我将不胜感激

这是我的控制器代码:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using System.Web.Http.Description;
    using studentsexams.Models;

    namespace studentsexams.Controllers
    {
        public class studentController : ApiController
        {
    private studentsEntities db = new studentsEntities();

    // GET api/student
    public IQueryable<student> Getstudents()
    {
        return db.students;
    }

    // GET api/student/5
    [ResponseType(typeof(student))]
    public IHttpActionResult Getstudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }

    public student GetStudentByName(string name)
    {
        return StudentRepository.GetStudents().FirstOrDefault(s => s.Id == 1);
    }



    // PUT api/student/5
    public IHttpActionResult Putstudent(int id, student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != student.ids)
        {
            return BadRequest();
        }

        db.Entry(student).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!studentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST api/student
    [ResponseType(typeof(student))]
    public IHttpActionResult Poststudent(student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.students.Add(student);

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateException)
        {
            if (studentExists(student.ids))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = student.ids }, student);
    }

    // DELETE api/student/5
    [ResponseType(typeof(student))]
    public IHttpActionResult Deletestudent(int id)
    {
        student student = db.students.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        db.students.Remove(student);
        db.SaveChanges();

        return Ok(student);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool studentExists(int id)
    {
        return db.students.Count(e => e.ids == id) > 0;
    }
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用System.Web.Http;
使用System.Web.Http.Description;
使用学生照相机、模型;
命名空间studentsexams.Controllers
{
公共类学生控制器:ApiController
{
私人学生属性db=新学生属性();
//获取api/学生
公共IQueryable Getstudents()
{
返回db.students;
}
//获取api/student/5
[响应类型(类型(学生))]
公共IHttpActionResult Getstudent(内部id)
{
student=db.students.Find(id);
如果(学生==null)
{
返回NotFound();
}
返回Ok(学生);
}
公共学生GetStudentByName(字符串名称)
{
return StudentRepository.GetStudents().FirstOrDefault(s=>s.Id==1);
}
//放置api/student/5
公共IHttpActionResult Putstudent(内部id,学生)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
if(id!=student.id)
{
返回请求();
}
db.Entry(student.State=EntityState.Modified;
尝试
{
db.SaveChanges();
}
catch(DbUpdateConcurrencyException)
{
如果(!studentExists(id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回状态码(HttpStatusCode.NoContent);
}
//海报/学生
[响应类型(类型(学生))]
公共IHttpActionResult博士后(学生)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
db.students.Add(学生);
尝试
{
db.SaveChanges();
}
捕获(DbUpdateException)
{
if(studentExists(student.id))
{
返回冲突();
}
其他的
{
投掷;
}
}
返回CreatedAtRoute(“DefaultApi”,新的{id=student.ids},student);
}
//删除api/student/5
[响应类型(类型(学生))]
公共IHttpActionResult Deletestudent(内部id)
{
student=db.students.Find(id);
如果(学生==null)
{
返回NotFound();
}
db.student.Remove(学生);
db.SaveChanges();
返回Ok(学生);
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
私有bool studentExists(内部id)
{
返回db.students.Count(e=>e.ids==id)>0;
}
}

}

假设您希望调用GetStudentByName的API操作,因此需要在WebApiConfig中添加路由

如下所示类似:-

config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}/{name}");

config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
public Student GetStudentByName(string name)
    {
        return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
         //in this line just replace StudentName to your student name 
           //property of model class.
    }
$.getJSON('/api/student/GetStudentByName/abc', function (data) {
        $.each(data, function (key, value) {

        });
    });
并在控制器中添加操作,如:-

config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}/{name}");

config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
public Student GetStudentByName(string name)
    {
        return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
         //in this line just replace StudentName to your student name 
           //property of model class.
    }
$.getJSON('/api/student/GetStudentByName/abc', function (data) {
        $.each(data, function (key, value) {

        });
    });
和调用部分,如:-

config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}/{name}");

config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
public Student GetStudentByName(string name)
    {
        return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
         //in this line just replace StudentName to your student name 
           //property of model class.
    }
$.getJSON('/api/student/GetStudentByName/abc', function (data) {
        $.each(data, function (key, value) {

        });
    });

因此,在本例中,您将能够使用abc名称调用GetStudentByName操作。

在控制器中,我们应该添加–由Pragnesh Khalas回答:

public Student GetStudentByName(string name)
{
return db.students.ToList().FirstOrDefault(s => s.StudentName == name); 
}
在这一行中,只需将StudentName替换为model类的student name属性


它工作正常,返回正确的数据

谢谢你回答我。我必须在模型中定义GetStudents()吗?代替StudentRepository-我必须写我的类(控制器或模型)的名称吗?如果您在模型中定义函数,那么就不可能作为API调用。我知道,但我正在努力解决错误。若我只是将这部分代码复制粘贴到控制器中,它将返回一个studentRepository错误——“当前上下文中不存在”。怎么办?这实际上是自动生成的代码。除了您的代码,我没有插入任何内容。更改代码,如return db.students.ToList().FirstOrDefault(s=>s.StudentName==name);在这一行中,只需将StudentName替换为model类的student name属性。