# 网络请求

**刚开始接触网络请求时，倒是知道怎么写原生的js 请求，现在都是用jq的ajax了，而且还多了很多的类似的库，有$http、axions,等。发现有的时候还是的用到原生的js请求。其实在昨天，我还是把表单请求和ajax混在一起的，表单请求不就是ajax 里的contentType为application/application/x-www-form-urlencoded ?**

真是太无知了，太嫩了！

* 表单请求是不需要js代码的，浏览器可以不用开启js引擎！，走的是浏览器，所有会导致页面的刷新。

```
   <form
     action="www.api.com/test"
      method="post"
   >
      <input type="text" name="filed1">
      <button type="submit"></button>
   </form>
```

这样当点击提交按钮的时候会默认获取input的数据，生成键值对，键名是input的name属性，值是input的value。然后把请求地址是form的action.

* ajax 请求底层封装的是XMLHttpRequest，这个是用的js引擎，所以浏览器必须开启js引擎。这样浏览器不会刷新页面。

**什么时候表单提交优势大于ajax这样的XMLHttpRequest 呢？**

在做文件下载和文件上传的时候，用表单的方式优势大。因为文件类型的特别，现在除了formData对象可以接收文件类型，就可以通过ajax传给后台了。但是文件下载就不可以，当后台返回一个文件流时，ajax的响应数据会解析成字符串，ajax不支持blob 类型。所以一般在实现文件的下载时，有三种方法：

1. 直接把请求地址放在浏览器上，例如：window.loaction.href= "......." ；因为浏览器是可以解析文件流的。然而这样的方法不能实现post 方式传参。
2. 表单的形式，这样请求走的是浏览器。依然可以解析文档流。可是这样的方式还是有局限性，传递参数的方式contentType 只能是 **application/application/x-www-form-urlencoded 。而且**有的时候我们要传递的参数，不是说是在input里填的内容，可能是某个对象或是数组。不过机智的是，我们可以用一个隐藏的文本框input，在点击提交的时候，把这个是对象或数组的参数，字符串化，赋给这个input,这样就可以传个对象过去了。但是还是没解决ContentType 为 **application/json,**
3. 原生的XMLHttpRequest.可以返回文档流，而且不会像ajax把它解析成字符串.并且传参的方式就可以是多样化的了。不过返回的文档流得需要用到blob对象来解析成文件从而下载出啦。（**具体请看原生js请求**）
