1:修改App_Start/WebApiConfig.cs文件,使用json以及修改路由
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Net.Http.Formatting;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
namespace WebAPI
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
#region json formatter(bryan add)
// Web API configuration and services
var json = config.Formatters.JsonFormatter;
// 解决json序列化时的循环引用问题
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
// 删除XML序列化器
config.Formatters.Remove(config.Formatters.XmlFormatter);
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
#endregion
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/{controller}/{id}",
//bryan add {action}
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
2:实现跨域调用
1)使用nuget安装Microsoft.AspNet.WebApi.Cors,安装的时候切记指定-Version 5.0.0版本,否则获取的最新5.2.2.0与其它低版本dll无法兼容
相关命令:Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.0.0
2)配置web.config文件
在system.webServer节点添加以下节点
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Max-Age" value="30"/>
<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS"/>
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>
3:开发api接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Script.Serialization;
using System.Text;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using WebAPI.Models;
using System.Web.Http.Cors;
using System.Web;
namespace WebAPI.Controllers
{
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class UserController : ApiController
{
/// <summary>
/// test: http://localhost/yourproject/api/user/TestGet?pID=5&pName=1212
/// </summary>
/// <param name="pID"></param>
/// <param name="pName"></param>
/// <returns></returns>
[HttpGet]
public HttpResponseMessage TestGet(int pID, String pName)
{
try
{
APIResult temp = new APIResult();
temp.ResultCode = 0;
temp.ResultMessage = "ok";
temp.ResultContent = "ok content";
TestUser u = new TestUser();
u.ID = pID;
u.Name = pName;
temp.ResultObject = JsonConvert.SerializeObject(u);
temp.ResultObject = JsonConvert.SerializeObject(u);
return Request.CreateResponse(HttpStatusCode.OK, temp);
}
catch (Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
}
/// <summary>
/// test: http://localhost/yourproject/api/user/TestPost
/// </summary>
/// <returns></returns>
[HttpPost]
public HttpResponseMessage TestPost()
{
try
{
APIResult temp = new APIResult();
//获取传统context
HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];
//定义传统request对象
HttpRequestBase request = context.Request;
//--------------------------------------------- post data start
string pd_content = "";
string pd_password = "";
if (request.Form.AllKeys.Contains("pd_content"))
{
pd_content = request.Form["pd_content"];
byte[] b_pd = Convert.FromBase64String(pd_content);
pd_content = Encoding.Default.GetString(b_pd);
JObject jo = (JObject)JsonConvert.DeserializeObject(pd_content);
if (jo["password"] != null)
{
pd_password = jo["password"].ToString();
}
else
{
temp.ResultCode = 1;
temp.ResultMessage = "password not found.";
}
}
//--------------------------------------------- post data end
temp.ResultCode = 1;
temp.ResultMessage = pd_password;
return Request.CreateResponse(HttpStatusCode.OK, temp);
}
catch (Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
}
}
}
4:开发ajax调用测试(php)
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<link href="jquery-ui/css/jquery-ui-1.10.1.custom.css" rel="stylesheet">
<script src="jquery-ui/jquery-1.9.1.js"></script>
<script src="jquery-ui/jquery-ui-1.10.1.custom.js"></script>
<link href="jquery-ui/css/jquery-ui-1.10.1.custom.css" rel="stylesheet">
<script src="jquery-ui/jquery-1.9.1.js"></script>
<script src="jquery-ui/jquery-ui-1.10.1.custom.js"></script>
<?php
function createjs()
{
$arr_json = Array();
$arr_json["password"] = "000000";
return json_encode($arr_json);
}
$s_json = createjs();
$s_b64 = base64_encode($s_json);
?>
<script type="text/javascript">
var s_b64 = "<?php echo $s_b64;?>";
/**
* api/user/Register_CheckPassword
*/
function apiTest()
{
$('#div_error').html("");
//本地ajax調用
var myurl = "http://localhost/yourproject/api/user/TestPost";
$('#div_loading').html("<img src='loading.gif'>");
$.ajax({
type:"post", //请求方式
url:myurl, //发送请求地址
crossDomain: true,
data:{
pd_content: s_b64
},
dataType:"json",
//请求成功后的回调函数有两个参数
success:function(data,textStatus){
var jsonstr = JSON.stringify(data);
$("#div_test").html(jsonstr);
},
//请求失败时将调用此方法
error:function(XMLHttpRequest, textStatus, errorThrown) {
$('#div_error').html("<lable style=\"color: #FF0000;\">network error,please try again.</lable>");
},
//请求完成后回调函数 (请求成功或失败时均调用)
complete:function(XMLHttpRequest,textStatus){
$('#div_loading').html("");
}
});
}
</script>
<div>
<a href="javascript:apiTest();">test</a>
</div>
<div id="div_error"></div>
<br>
<div id="div_test"></div>
<br>
<div id="div_loading" style="width:16px;height:16px;"/>