我是创建WEB API的初学者。
我从数据库自动生成模型,然后是每个模型的控制器,我的服务在默认设置下运行良好。
例如:
[ResponseType(typeof(student))]
public IHttpActionResult Getstudent(int id)
{
student student = db.students.Find(id);
if (student == null)
{
return NotFound();
}
return Ok(student);
}
现在,当我使用时调用它:
本地主机... / API /学生/ 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;
}
}
}
答案 0 :(得分: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) {
});
});
因此,在此示例中,您将能够使用abc名称调用GetStudentByName操作。
答案 1 :(得分:0)
在控制器中我们应该添加 - 由Pragnesh Khalas回答:
public Student GetStudentByName(string name)
{
return db.students.ToList().FirstOrDefault(s => s.StudentName == name);
}
此行中的只是将StudentName替换为模型类的学生姓名属性。
它有效,它会返回正确的数据!