http请求

295 阅读2分钟

原生js 的get请求 let xhr = new XMLHttpRequest(); xhr.open("GET", "/list"); xhr.send(); xhr.open第一个参数是请求方法,第二个参数是请求url,然后把它send出去就行了。 如果需要加上请求参数,如果用jQuery的ajax,那么是这么写的: $.ajax({url: "/list",data: {page: 5}}); function ajax (url, data) { let args = []; for (let key in data) { // 参数需要转义 args.push({encodeURIComponent(key)} ={encodeURIComponent(data[key])}); } let search = args.join("&"); // 判断当前url是否已有参数 url += ~url.indexOf("?") ?&{search}` : `?{search}; let xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.send(); }

那为什么用jq就不用呢?因为jq帮我们做了,jq的ajax支持一个叫processData的参数,默认为true:$.ajax({ url: "/list", data: { page: 5 }, processData: true });

如果它是一个数组的话,这个数组的每一个元素都会变成单独的一个请求字段,它的key是父级的key拼上数组的索引得到,如{ids: [1, 2, 3]}就会被拼成:ids[0]=1、ids[1] = 2、ids[2] = 3,如果是一个Object的话key的后缀就是子Object的key,如{user: {id: 1333, name: "yin"}}会被拼成:user[id]=1333、user[name]=yin,否则就认为它是一个简单的类型,就直接调一下param函数定义的add,把它push到s那个数组。这里用到了递归调用,会不断地拼key值,直到value是一个普通变量了,就到了最后面的else逻辑。也就是说,以下代码:$.ajax({ url: "/list", data: { user: { name: "yin", age: 18 } }, });

将会被拼成的url为:/list?user[name]=yin&user[age]=18注意上面的中括号还没有转义。而如果是一个数组的话:$.ajax({ url: "/list", data: { ids: [1, 2, 3] }, });

拼成的请求url为:/list?ids[0]=1&ids[1]=2&ids[2]=3如果后端用的Java的Spring MVC框架的话,是理解这种格式的,框架收到这样的参数后会生成一个Array,传递给业务代码,业务代码是不用关心怎么处理这种参数的。其它的框架应该也类似。

POST请求的参数就不是放在url了,而是放在send里面,即请求体。你可能会问:难道就不能放url么?我就要放url。如果你够任性,那么可以,前提是后端所使用的http框架能够在url里面取数据,因为它一定会收到url,也一定会收到请求体,所以取决于它要怎么处理,按照http标准,如果请求方法是POST,那么应该是得去请求体拿的,就不会在url的search上取了,当然它可以改一下,改成两个都可以拿。

let xhr = new XMLHttpRequest(); xhr.open("POST", "/add"); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("id=5&name=yin");