前端網頁傳值給後端伺服器的幾種方式

這些知識不難,也常常使用到
但沒有做一個統整
因此今天來總結一下

HTML

不用寫任何程式就能實現
簡單的 <a> 標籤

<a href="url?paramA=valueA&paramB=valueB" rel="external nofollow" >click</a>

以及 <form> 標籤表單提交

<form action="url" method="post" >
    <input type="text" placeholder="paramA" name="paramA">
    <input type="text" placeholder="paramB" name="paramB">
    <input type="submit" value="submit">
</form>

但基本上傳的資料不可能寫死
甚至往往需要經過修改後才傳
這時候就需要 JavaScript 處理

JavaScript

JavaScript 一樣能做到跳轉效果

window.location.href = "url?paramA=valueA&paramB=valueB";

甚至還能提交隱藏表單

function submit(url, params, type="post") {
    const form = document.createElement("form");
    form.method = type;
    form.action = url;

    for (const key in params) {
        if (params.hasOwnProperty(key)) {
            const field = document.createElement("input");
            field.type = "hidden";
            field.name = key;
            field.value = params[key];
            form.appendChild(field);
        }
    }

    document.body.appendChild(form);
    form.submit();
}

//call
submit("url", { paramA : "valueA", paramB : "valueB" });

不過以上四種方法都會回傳一個全新的頁面
就算是回傳原本的頁面也會看到閃爍
為了避免轉址要使用非同步技術

不同步 Asynchronous

透過 XMLHttpRequest 物件
發起 get 請求
然後以 callback function 執行後續動作

var xhr = new XMLHttpRequest();
xhr.open("GET", "url?paramA=valueA&paramB=valueB");
xhr.send(null);

//callback
xhr.onload = function () {
    alert(xhr.responseText);
};

post 請求

var xhr = new XMLHttpRequest();
xhr.open("post", "url");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("paramA=valueA&paramB=valueB");

傳送 json 資料

var params = { paramA : "valueA", 
               paramB : "valueB" };

var xhr = new XMLHttpRequest();
xhr.open("post", "url");
xhr.setRequestHeader("Content-type", "application/json");
xhr.send(JSON.stringify(params));

原生 JavaScript 的寫法稍嫌冗長
使用 jQuery 套件較為輕鬆

jQuery 函式庫

jQuery 也有 getpost
但是因為等效於 ajax
就不再多做介紹

$.ajax({
    type: "GET",
    url: "url",
    dataType: "text",
    data: {
        paramA: "valueA",
        paramB: "valueB"
    },
    success: function(responseText) {
        alert(responseText);
    },
    error: function() {
        alert("error");
    },
    complete: function() {
        alert("complete");
    }
});
參數說明
type請求類型POST / GET (default)
url請求位置
dataType回傳的資料類型 (from Server)xml、html、script、json、jsonp、text
data傳遞的資料key:value, key:value, …
contentType傳遞的資料型態 (to Server)“application/x-www-form-urlencoded; charset=UTF-8″:default
“application/json; charset=utf-8″:json
async同步或非同步true / false
success請求成功執行的函式function
error請求失敗執行的函式function
complete請求完成(不論成功與否)執行的函式function

結論

從以上介紹可以看到歷史演進的過程
新技術的出現就是為了彌補舊技術的不足
但只要能滿足業務需求
又不需要大費周章
就是合適的方式

方式技術類型非同步
超連結HTMLget
表單HTMLget、post
跳轉JavaScriptget
隱藏表單JavaScriptget、post
XMLHttpRequestJavaScriptget、post
jQuery.get()jQueryget
jQuery.post()jQuerypost
jQuery.ajax()jQueryget、post