axios与request的区别
发送数据类型的区别
- axios 会根据要发送的数据来设置合理的Content-type,默认是application/json
//
data
是作为请求主体被发送的数据
// 只适用于这些请求方法 ‘PUT’, ‘POST’, 和 ‘PATCH’
// 在没有设置transformRequest
时,必须是以下类型之一:
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
// - 浏览器专属:FormData, File, Blob
// - Node 专属: Stream
axios.post(url, data, config)
- 当data是string的时候,1axios会尝试先将其作为JSON对象解析,如果能够解析成plain object,就会按照键值对设置Form data。2如果不能解析成对象,那么将会按照URLSearchParams的形式解析,类似于下面
sign=shal&id=12
=>
Form data
sign: sha1
id: 12
- 如果上述都失败,那么只会认为是一个空的key
axios.post(url, ‘sign’, config)
=>
Form data
sign
当传入string/URLSearchParams的时候,会设置成application/x-www-form-urlencoded
当传入plain object的时候,会设置成application/json
当传入FormData/File的时候,将会设置成multipart/form-data
当传入ArrayBuffer/ArrayBufferView/blob的时候,应该显式地设置为application/octet-stream
request库则只能传入 a Buffer, String or ReadStream,并且要显示地在headers中设置Content-type
响应的数据类型区别
- axios如何处理响应的数据取决于request中的responseType值。
axios.post(
url,
data,
{
responseType: 'arrayBuffer' // 默认是json
}
)
如上,请求返回的数据将会被视为arrayBuffer处理。
responseType可取的值是 ‘arraybuffer’, ‘blob’, ‘document’, ‘json’, ‘text’, ‘stream’。
当我们设置responseType为text的时候,却依然axios还是会对其做一次json的处理,这是一个已知的bug。具体的解决方案,可以通过指定transformResponse 来跳过axios的默认转换。
axios.post(
url,
data,
{
transformResponse: data => data,
responseType: 'text' // 默认是json
}
)
- 而requese库返回的数据只有两种类型,String或者是Buffer。当指定encoding为null的时候,返回的body是Buffer类型,其他任何情况,(包括undefined)都是以utf8的编码转为字符串。
request({
uri: '',
methods: '',
headers: {},
body: ''
}, (err, response, body) => {
typeof body == 'string' // true
})
如何判断响应失败的区别
- axios默认是只要http response code不在2xx的范围内,一律reject。你也可以指定失败的状态码范围。
axios.get('/user/12345', {
validateStatus: function (status) {
return status < 500; // Reject only if the status code is greater than or equal to 500
}
})
- 而request库处理错误的情况和http.clientRequest一致。只有当建立连接,发起请求的过程中失败才会reject,凡是服务器响应,包括4xx,5xx都算是成功。
request({
uri: 'not exist url'
}, (err, responst, body) => {
err == null // true
})