四种 post 请求格式的XMLHttpRequest 写法

本文介绍了一种前端JS通过不同格式发送POST请求到Go后端的方法,并展示了如何解析这些请求。具体包括使用FormData、JSON、纯文本及x-www-form-urlencoded格式的数据传输方式。

前端 js 请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>post test</title>>
    <script>
        function send(type) {
            url = "http://127.0.0.1:8080/";
            xhr = new XMLHttpRequest();
            xhr.open("post", url, true);
            var data;
            if (type === "formdata") {
                data = new FormData();
                data.append("key", "value");
            } else if (type === "json") {
                xhr.setRequestHeader("Content-Type", "application/json");
                data = JSON.stringify({"key": "value"});
            } else if (type === "text") {
                data = "key=value";
            } else if (type === "www") {
                // 这个header 其实是 传统post 表单的格式
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                data = "key=value";
            }
            xhr.send(data);
        }

    </script>
</head>
<body>
<div>
    <input type="button" onclick="send('formdata')" value="FormData"/>
    <br/>
    <input type="button" onclick="send('json')" value="application/json"/>
    <br/>
    <input type="button" onclick="send('text')" value="text"/>
    <br/>
    <input type="button" onclick="send('www')" value="application/x-www-form-urlencoded"/>
</div>
</body>
</html>>

后端处理

package main

import (
"fmt"
"net/http"
)


func IndexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("before parse:")
	printKey(r);

	r.ParseForm()
	
	fmt.Println("ParseForm:")
	printKey(r);

	r.ParseMultipartForm(2048)
	
	fmt.Println("ParseMultipartForm:")
	printKey(r);
}
func printKey( r *http.Request){
	fmt.Println(r.Form["key"])
	fmt.Println(r.PostForm["key"])
	if r.MultipartForm!=nil {
		fmt.Println(r.MultipartForm.Value["key"])
	}
}



func main() {
	fmt.Println("listening 8080")
	http.HandleFunc("/", IndexHandler)
	http.ListenAndServe(":8080", nil)
}

  • get
    http://localhost:8080/?key=value1
 before parse:
[]
[]
ParseForm:
[value1]
[]
ParseMultipartForm:
[value1]
[]

  • application/x-www-form-urlencoded:
before parse:
[]
[]
ParseForm:
[value]
[value]
ParseMultipartForm:
[value]
[value]
  • FormData(MultipartForm)
before parse:
[]
[]
ParseForm:
[]
[]
ParseMultipartForm:
[value]
[value]
[value]

综上,使用 go 时:
ParseMultipartForm 这个函数要单独调用
postform 中有的 form中一定有,MultipartForm 中有的 postform 和 form也一定有

参考:
四种格式:
https://blog.youkuaiyun.com/tTU1EvLDeLFq5btqiK/article/details/78734023
转码说明:
https://www.w3schools.com/tags/att_form_enctype.asp

### 原生 JavaScript 发送 HTTP 请求获取数据的写法 在原生 JavaScript 中,发送 HTTP 请求的核心对象是 `XMLHttpRequest`,它允许开发者与服务器进行异步通信,从而实现数据的获取和更新,而无需刷新整个页面。以下是实现 `GET` 和 `POST` 请求的基本写法。 #### GET 请求 GET 请求通常用于从服务器获取数据。在创建 `XMLHttpRequest` 对象后,通过调用 `open` 方法初始化请求,并使用 `send` 方法发送请求。当请求状态发生变化时,可以通过 `onreadystatechange` 事件监听器处理服务器的响应。 ```javascript function ajaxGet(url, success, error) { var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } xhr.open('GET', url, true); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { success && success(xhr.responseText); } else { error && error(xhr.status); } } }; } ``` #### POST 请求 POST 请求通常用于向服务器发送数据。与 GET 请求不同,POST 请求需要设置请求头 `Content-Type` 来指定发送的数据类型,并在 `send` 方法中传递数据。 ```javascript function ajaxPost(url, data, success, error) { var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(data); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { success && success(xhr.responseText); } else { error && error(xhr.status); } } }; } ``` 在上述代码中,`readyState` 的值为 `4` 表示请求已完成,而 `status` 的范围在 `200` 到 `300` 或 `304` 表示请求成功。成功时调用 `success` 回调函数,失败时调用 `error` 回调函数[^3]。 ### 示例:发送 GET 请求 ```javascript ajaxGet('https://api.example.com/data', function (response) { console.log('数据获取成功:', response); }, function (errorCode) { console.error('请求失败,错误代码:', errorCode); }); ``` ### 示例:发送 POST 请求 ```javascript var postData = 'name=JohnDoe&age=25'; ajaxPost('https://api.example.com/submit', postData, function (response) { console.log('提交成功:', response); }, function (errorCode) { console.error('提交失败,错误代码:', errorCode); }); ``` ### 处理 JSON 数据 如果服务器返回的是 JSON 格式的数据,可以在 `success` 回调中使用 `JSON.parse` 将响应文本转换为 JavaScript 对象: ```javascript success && success(JSON.parse(xhr.responseText)); ``` 同样,如果需要发送 JSON 格式的数据,应将请求头 `Content-Type` 设置为 `application/json`,并在 `send` 方法中传递 JSON 字符串: ```javascript xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); ``` 这些方法为使用原生 JavaScript 实现基本的 HTTP 请求提供了基础框架,适用于大多数常见的前后端交互场景[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值