筆記一下,不然有點雜。
簡述
這裡會拿這隻 API 來示範。
主要是有些參數容易搞混,這邊先說明清楚:
dataType
預期 server 要回傳的資料格式,沒指定的話就看 server 怎麼設定。
contentType
要傳給 server 的資料格式,沒指定的話會是 application/x-www-form-urlencoded; charset=UTF-8
HTML:
1 2 3 4 5 6 7
| <form method="POST" action="https://gorest.co.in/public/v2/users"> <div><input name="name" type="text" /></div> <div><input name="gender" type="text" /></div> <div><input name="email" type="email" /></div> <input name="status" value="active" type="hidden" /> <input type="submit" value="送出" /> </form>
|
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const form = $('form')
form.bind('submit', (e) => { e.preventDefault() $.ajax({ url: 'https://gorest.co.in/public/v2/users', type: 'POST', headers: { Authorization: 'Bearer xxxx' }, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8', data: $('form').serialize(), success: (response) => console.log(response) }) })
|
serialize()
是 jQuery 提供的方法,用來把表單資料轉成這樣的 url 的字串格式:name=xxx&gender=xxx&
。
它會根據 selector 決定是「整個表單」還是「單一元素」,詳細可參考官方說明
用 FormData 物件發 POST
FormData
因為是用物件來包資料,所以要特別設定兩個東西:
processData: false
不要去動資料
contentType: false
不要設定 contentType
HTML:
1 2 3 4 5 6 7
| <form method="POST" action="https://gorest.co.in/public/v2/users"> <div><input name="name" type="text" /></div> <div><input name="gender" type="text" /></div> <div><input name="email" type="email" /></div> <input name="status" value="active" type="hidden" /> <input type="submit" value="送出" /> </form>
|
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const form = $('form')
form.bind('submit', (e) => { e.preventDefault() const formData = new FormData(e.target) $.ajax({ url: 'https://gorest.co.in/public/v2/users', type: 'POST', headers: { Authorization: 'Bearer xxx' }, dataType: 'json', data: formData, processData: false, contentType: false, success: (response) => console.log(response) }) })
|
傳送 JSON 格式的資料
HTML:
1
| <button class="btn">送出</button>
|
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const data = { name: 'ppasp', gender: 'male', email: 'qwqqekeop@gmail.com', status: 'active' }
$('.btn').bind('click', () => { $.ajax({ url: 'https://gorest.co.in/public/v2/users', type: 'POST', headers: { Authorization: 'Bearer fec7e32332c2367cc51b5669e8397e54f171439891820bfa3bfe420cf6a5c996' }, dataType: 'json', data: JSON.stringify(data), contentType: 'application/json; charset=utf-8', success: (response) => console.log(response) }) })
|
直接傳送 JavaScript 物件
這種方式要把 Content-Type 設定為 application/x-www-form-urlencoded; charset=UTF-8
。從 payload 結果推測是因為直接傳 Object 的話瀏覽器會自動轉成表單的格式:name=xxx&gender=xxx&
,所以才要特別設置。
HTML:
1
| <button class="btn">送出</button>
|
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const data = { name: 'ppasweqeasp', gender: 'male', email: 'qwqasdqqekeop@gmail.com', status: 'active' }
$('.btn').bind('click', () => { $.ajax({ url: 'https://gorest.co.in/public/v2/users', type: 'POST', headers: { Authorization: 'Bearer fec7e32332c2367cc51b5669e8397e54f171439891820bfa3bfe420cf6a5c996' }, dataType: 'json', data: data, contentType: 'application/x-www-form-urlencoded; charset=UTF-8', success: (response) => console.log(response) }) })
|