最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

十年河东十年河西,莫欺少年穷。 

学无止境,精益求精

   在介绍本篇博客之前,先来温故下AJax的请求,直接上别人的介绍,勿怪。

如下:

jquery中的ajax方法参数总是记不住,这里记录一下。

   1.url: 
   要求为String类型的参数,(默认为当前页地址)发送请求的地址。

   2.type: 
   要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。

   3.timeout: 
   要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。

   4.async: 
   要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。

   5.cache: 
   要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。

   6.data: 
   要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,可以查看  processData选项。对象必须为key/value格式,例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery将自动为不同值对应同一个名称。例如{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2。

7.dataType: 
要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
json:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
text:返回纯文本字符串。

   8.beforeSend:
   要求为Function类型的参数,发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。
            function(XMLHttpRequest){
               this;   //调用本次ajax请求时传递的options参数
            }
   9.complete:
   要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。参数:XMLHttpRequest对象和一个描述成功请求类型的字符串。
          function(XMLHttpRequest, textStatus){
             this;    //调用本次ajax请求时传递的options参数
          }

   10.success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
         (1)由服务器返回,并根据dataType参数进行处理后的数据。
         (2)描述状态的字符串。
         function(data, textStatus){
            //data可能是xmlDoc、jsonObj、html、text等等
            this;  //调用本次ajax请求时传递的options参数
         }

   11.error:
   要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:
       function(XMLHttpRequest, textStatus, errorThrown){
          //通常情况下textStatus和errorThrown只有其中一个包含信息
          this;   //调用本次ajax请求时传递的options参数
       }

   12.contentType:
   要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。

  13.dataFilter:
  要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
            function(data, type){
                //返回处理后的数据
                return data;
            }

   14.dataFilter:
   要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
            function(data, type){
                //返回处理后的数据
                return data;
            }

   15.global:
   要求为Boolean类型的参数,默认为true。表示是否触发全局ajax事件。设置为false将不会触发全局ajax事件,ajaxStart或ajaxStop可用于控制各种ajax事件。

   16.ifModified:
   要求为Boolean类型的参数,默认为false。仅在服务器数据改变时获取新数据。服务器数据改变判断的依据是Last-Modified头信息。默认值是false,即忽略头信息。

   17.jsonp:
   要求为String类型的参数,在一个jsonp请求中重写回调函数的名字。该值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,例如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。

   18.username:
   要求为String类型的参数,用于响应HTTP访问认证请求的用户名。

   19.password:
   要求为String类型的参数,用于响应HTTP访问认证请求的密码。

   20.processData:
   要求为Boolean类型的参数,默认为true。默认情况下,发送的数据将被转换为对象(从技术角度来讲并非字符串)以配合默认内容类型"application/x-www-form-urlencoded"。如果要发送DOM树信息或者其他不希望转换的信息,请设置为false。

   21.scriptCharset:
   要求为String类型的参数,只有当请求时dataType为"jsonp"或者"script",并且type是GET时才会用于强制修改字符集(charset)。通常在本地和远程的内容编码不同时使用。

以上便是Ajax请求各参数介绍

下面开始咱们的AJax请求之Get方式

Get请求就是通过URL地址进行的请求,其有如下特点:

1、Get请求的安全性不如Post

2、Get请求允许传递的数据量为1024字节,因此:不宜传递过多数据,否则会超出限制

3、Get请求时,将各个参数浮在URL之后进行请求,也就是将数据放在Http协议头中

下面来简单介绍下几种不同的Get请求

1、不传递参数的Get请求

2、传递一个参数的Get请求

3、传递多个参数的Get请求

4、传递一个实体的Get请求

在进行之前,先来做下准备工作(本案例并没有做到真正的数据持久化,仅仅为简单模拟而已):

首先建一个Person类,如下:

 public class Person
{
private int id; public int Id
{
get { return id; }
set { id = value; }
}
private int age; public int Age
{
get { return age; }
set { age = value; }
}
private string name; public string Name
{
get { return name; }
set { name = value; }
}
private string sex; public string Sex
{
get { return sex; }
set { sex = value; }
} }

很简单,不多说。

另一个ResultToJson类,如下:<我之前的博客中有专门描述,请参照我的博客:C# web api 返回类型设置为json的两种方法>

如下:

 public class ResultToJson
{
public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String || obj is Char)
{
str = obj.ToString();
}
else
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
str = serializer.Serialize(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
}

最后一个就是JsonHelper类,这个大家可参考我之前的博客:C#处理JSON数据

至此:准备工作准备完毕

新建一个WebApi控制器如下:

 public class PersonController : ApiController
{
List<Person> list = new List<Person>();
/// <summary>
/// 初始化数据
/// </summary>
public PersonController()
{
for (int i = ; i < ; i++)
{
Person P = new Person()
{
Id = i,
Name = "Name" + i,
Age = i,
Sex = i % == ? "M" : "W"
};
list.Add(P);
}
}
}

1、不传参数的Get请求如下:

        /// <summary>
/// 简单测试案例
/// </summary>
/// <returns></returns>
[HttpGet]
public string Get()
{
return "OK";
}
//无参数请求-简单示例
$(document).ready(function () {
$.ajax({
url: "http://localhost:9953/api/Person/Get",
type: "get",
contentType: "application/json",
dataType: "text",
data:{},
success: function (result,status) {
if (status == "success") {
alert(result);
}
},
error: function (error) {
alert(error);
}
});
});

2、传递一个参数的案例如下:

        /// <summary>
/// 通过id获取特定数据
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet]
public string GetById(int Id)
{
list = list.Where(p => p.Id == Id).ToList();
return JsonHelper.JsonSerializer<List<Person>>(list);
}
 //单个参数传递
$(document).ready(function (data) {
$.ajax({
url: "http://localhost:9953/api/Person/GetById",
type: "get",
dataType: "text",
data: {Id:""},
success: function (result,status) {
alert(result)
},
error: function (error) {
alert(error);
}
});
});

有兴趣的小虎斑们也可以尝试URL传参的方法:<把请求的data去掉,URL后面加上传递的参数>

 //单个参数传递
$(document).ready(function (data) {
$.ajax({
url: "http://localhost:9953/api/Person/GetById?Id=3",
type: "get",
dataType: "text",
success: function (result,status) {
alert(result)
},
error: function (error) {
alert(error);
}
});
});

3、传递多个参数如下:

        /// <summary>
/// 多个参数传递
/// </summary>
/// <param name="Name"></param>
/// <returns></returns>
[HttpGet]
public HttpResponseMessage GetByIdAndSex(int Id,string Sex)
{
List<Person> list_2 = new List<Person>();
var Result = from r in list
where r.Id == Id && r.Sex==Sex
select r;
foreach (var Item in Result)
{
list_2.Add(Item);
}
return ResultToJson.toJson(list_2);
}
        //多个参数传递
$(document).ready(function (data) {
$.ajax({
url: "http://localhost:9953/api/Person/GetByIdAndSex",
type: "get",
contentType: "application/json",
dataType: "text",
data: { Id: "",Sex:"W" },
success: function (result, status) {
alert(result)
},
error: function (error) {
alert(error);
}
});
});

当然,有兴趣的小虎斑也可以将参数放在URL后面进行测试,在此不作说明!

4、传递一个实体

        /// <summary>
/// 对象作为参数
/// </summary>
/// <param name="P"></param>
/// <returns></returns>
[HttpGet]
public HttpResponseMessage GetByObject([FromUri]Person P)
{
return ResultToJson.toJson(P);
}
        //传递一个对象该如何?
$(document).ready(function (data) {
$.ajax({
url: "http://localhost:9953/api/Person/GetByObject",
type: "get",
dataType: "text",
data: { Id: "",Sex:"男",Name:"陈卧龙",Age:"" },
success: function (result, status) {
alert(result)
},
error: function (error) {
alert(error);
}
});
});

大家可能发现传递实体时,代码和上述有点不同,GetByObject([FromUri]Person P)加了一个[FromUri]。如果不加上这个关键词的话,那么则会传递实体失败,究其原因如下:

还记得有面试题问过get和post请求的区别吗?其中有一个区别就是get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),而post请求则是放在http协议包的包体中。

如果大家不加上[FromUri]关键字,Get请求时URL会被解析为:http://localhost:9953/api/Person/GetByObject?Id=8888&Sex=男&Name=陈卧龙&Age=26,当被解析成这种格式后,Net后端的webApi是无法解析成实体对象的。因此,在传递一个对象时,我们有必要加上[FromUri]关键字。

其实:在所有的Get请求时,我建议大家都加上[FromUri]关键字,这样就不会引发诸如上述的问题。再说了,养成一个好的习惯不是挺好的么?

@陈卧龙的博客

C# WebApi传参之Get请求-AJAX的更多相关文章

  1. C# WebApi传参之Post请求-AJAX

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    上一节讲述了C# WebApi传参之Get请求 ...

  2. WebApi传参总动员(四)

    前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpP ...

  3. WebApi传参总动员(一)

    目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...

  4. WebApi传参总动员(三)

    上篇介绍了如何从输入流中获取实体对象.本篇介绍以url形式传递参数.简单的参数不再赘述,这里主要实现形如(string name,Woman woman)这样的参数传递. 本篇及后面几章均涉及js调用 ...

  5. WebAPI传参

    1.GET请求传递参数 URL传参:http://localhost/ApiTest/test?id=1 API接收参数 [HttpGet] public string GetUser(int id) ...

  6. C#进阶系列——WebApi 传参详解

    本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参数如何传递. 回到顶部 一.get请求 对于取数据, ...

  7. WebApi传参总动员(五)

    上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(stri ...

  8. WebApi传参总动员(填坑)

    本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和W ...

  9. WebApi传参总动员(二)

    上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] p ...

随机推荐

  1. php实现多任务并发探讨

    如果是后台任务,需要通过队列转换为异步执行 如果是网络任务,可以使用socket_select 或者stream_select来执行(基于select模型) 如果一定要使用多线程可以安装多线程扩展,用 ...

  2. CREATE INDEX SELECT COUNT(*)

    CREATE INDEX windex_countrycode ON sales_rank (countrycode); CREATE INDEX windex_grab_amz_date ON sa ...

  3. garbage collection - 垃圾收集

    Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...

  4. 浏览器cookie数

    <?php for ($w=0; $w < 200 ; $w++) { setcookie('name'.$w,'value'.$w, time()+3600*10 ); } var_du ...

  5. PureBasic—数控编辑框与调节块和进度条

    三个有关上下限问题的控件,它们也是主要控件的组成部分,分别为:SpinGadget()        数控编辑框TrackBarGadget()    调节块控件ProgressBarGadget() ...

  6. startActivityForResult的用法和demo

    [转]startActivityForResult的用法和demo 博客分类:  java 移动开发 有时候我们需要把A activity提交数据给B  activity处理,然后把结果返回给A 这种 ...

  7. C++ 中static 使用大全

    /// 静态全局变量 :只能在当前cpp中访问到  static int s_global = 0; void funcA() {      /// 静态局部变量 (函数静态变量) 初始化过一次就不会 ...

  8. SQLQuery 实现别名映射

    public List getQueryList(Map paramMap, int start, int maxResults) throws DataAccessException, Hibern ...

  9. Bluetooth L2CAP介绍

    目录 1. 通用操作 1. L2CAP Channel 2. 设备间操作 3. 层间操作 4. 操作模式 2. 数据包格式(Data Packet Format) 1. B-Frame 2. G-Fr ...

  10. Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果(全部通过QSS实现)

    http://blog.csdn.net/goforwardtostep/article/details/53464925