MVC4 Fundamentals and the WebApi
Scott Allen
I only looked at this module of the course. John Papa referred to it in his single page application course. Not much new except if you didn't know about curl and handlebars.
- System.Web.Http
- System.Web.Http.WebHost
- GET, POST, PUT, DELETE by default
- [AcceptVerbs] for others
Scott preferes using a plural name. Eg. VideosController
cUrl
- curl http://somewebsite/api/videos
- curl http://somewebsite/api/videos -X GET
- curl http://somewebsite/api/videos -X DELETE
-> File not found exception, then IIS needs to be configured
-> IISExpress applicationhost file add on ExtentionlessUrl the verbs
- curl http://somewebsite/api/videos -X GET -v
- curl http://somewebsite/api/videos -X GET -H "Accept: application/json"
- curl http://somewebsite/api/videos -X POST -d "value=scott"
- curl http://somewebsite/api/videos -X POST -d "=scott"
Content negotiation
- Same resource can have multiple representations.
- Accept: image/png
- Accept: Text/html
Action Parameters
- Primitive types assumed to not be in the message body, unless public void Post([FromBody]string value) {}
- Complex types assumed in the message body
- Only a single model allowed from the message body
EF NuGet
- enable-migrations
- Seed(... AddOrUpdate( ) )
- update-database
- db.Configuration.ProxyCreationEnabled = false;
Showing Data in view
- Update-Package jQuery
- Update-Package HandleBars
- <script> type attribute is no longer needed in Html5
var videoApiUrl = '@Url.RouteUrl("DefaultApi", new { httproute="" , ... '
//global error handler
$(document).ajaxError(function (event, xhr) {
alert(xhr.status + ":" + xhr.statusText);
}
<script id="template" type="text/html>
{{#each video}}
{{Title}}
{{/each}}
</script>
Handlebars.compile($("#videoTable").html());
public Video GetVideo(int id)
{
var video = db.Find(id);
if (video==null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return video;
}
public HttpResponseMessage PutVideo(int id, Video video)
{
db.Entry(video).State = EntityState.Modified;
.. HttpStatus NotFound OK BadRequest
}
On post set 201 Created and add response.Headers.Location
On Delete check for DbUpdateConcurrencyException
install-package Microsoft.AspNet.WebApi.Client
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var result = client.GetAsync(new Uri(...))