怎么给接口传JSON:从基础到实践的完整指南
在前后端分离、微服务架构盛行的今天,JSON(JavaScript Object Notation)已成为接口数据交互的“通用语言”,无论是前端向后端提交数据,还是服务间调用传递参数,“怎么给接口传JSON”都是开发者必须的核心技能,本文将从基础概念出发,结合不同技术场景,详细拆解传JSON的正确姿势,并附常见问题避坑指南。
先搞懂:什么是JSON?为什么传JSON?
JSON是一种轻量级的数据交换格式,以“键值对”为核心结构,易于人阅读和编写,也方便机器解析和生成,其基本语法规则包括:
- 数据用
key: value表示,键需用双引号包裹(单引号不行!),值可以是字符串、数字、布尔值、数组、对象或null; - 多个键值对用逗号分隔,最后一个元素不加逗号;
- 对象用 包裹,数组用
[]包裹。
为什么接口传JSON?
- 通用性强:几乎所有编程语言都支持JSON解析,跨语言、跨平台无障碍;
- 结构清晰:能清晰表达复杂嵌套数据(如对象包含数组、数组内嵌套对象),比XML更简洁;
- 兼容性好:HTTP请求/响应中,JSON与
Content-Type: application/json完美配合,被浏览器和服务器广泛支持。
核心前提:HTTP请求头与Content-Type
给接口传JSON,最容易被忽略却最关键的一步是:设置正确的Content-Type请求头。Content-Type告诉服务器“我发送的数据是什么格式”,服务器据此解析请求体;如果格式不匹配,接口会直接返回“400 Bad Request”或“415 Unsupported Media Type”。
正确的Content-Type是什么?
传JSON时,请求头必须包含:
Content-Type: application/json
部分场景下还会同时指定字符集(虽然JSON默认UTF-8,但显式声明更规范):
Content-Type: application/json; charset=utf-8
常见错误:Content-Type与实际数据不匹配
比如请求头写Content-Type: application/x-www-form-urlencoded(表单格式),但请求体却是JSON字符串,服务器会尝试按“键值对&分隔”解析,导致解析失败。
不同场景下传JSON的实践方法
场景1:前端JavaScript(浏览器/Node.js)传JSON
(1)浏览器环境:fetch或XMLHttpRequest
现代前端开发中,fetch是主流API(比XMLHttpRequest更简洁)。
示例:POST请求传JSON
// 1. 定义JSON数据(JavaScript对象)
const userData = {
name: "张三",
age: 25,
hobbies: ["reading", "coding"],
address: {
city: "北京",
district: "海淀区"
}
};
// 2. 发送fetch请求
fetch("https://api.example.com/user", {
method: "POST", // 请求方法(POST/PUT/DELETE等)
headers: {
// 关键:设置Content-Type为application/json
"Content-Type": "application/json; charset=utf-8",
// 其他请求头(如认证token)
"Authorization": "Bearer your_token"
},
// 3. 将JS对象转为JSON字符串(请求体必须是字符串)
body: JSON.stringify(userData)
})
.then(response => {
// 4. 解析响应(假设返回JSON)
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log("Response:", data);
})
.catch(error => {
console.error("Request failed:", error);
});
关键点:
body必须是字符串,因此用JSON.stringify()将JS对象序列化为JSON字符串;- 不要手动拼接JSON字符串(如
'{"name": "张三"}'),容易因转义字符出错,始终用JSON.stringify()。
(2)Node.js环境:axios或node-fetch
Node.js中,axios是最流行的HTTP客户端(支持浏览器和Node.js),用法与浏览器fetch类似。
示例:axios传JSON
const axios = require("axios");
const data = {
name: "李四",
email: "lisi@example.com"
};
axios.post("https://api.example.com/user", data, {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer your_token"
}
})
.then(response => {
console.log("Response:", response.data);
})
.catch(error => {
console.error("Request failed:", error.message);
});
关键点:
axios会自动将JS对象转为JSON字符串(无需手动JSON.stringify()),并自动设置Content-Type: application/json,更便捷;- 如果需要手动控制,可以显式调用
JSON.stringify()并设置headers。
场景2:后端服务(Java/Python/Go等)传JSON
后端通常需要接收前端传来的JSON数据,或作为客户端向其他接口传JSON,以下以常见语言为例:
(1)Java:Spring Boot框架
Spring Boot中,用@RequestBody注解自动解析JSON请求体为Java对象。
示例:接收JSON并返回JSON
import org.springframework.web.bind.annotation.*;
// 定义DTO(数据传输对象),与JSON字段对应
class UserDTO {
private String name;
private int age;
// getters & setters
}
@RestController
@RequestMapping("/api")
public class UserController {
// POST接口,接收JSON并返回响应
@PostMapping("/user")
public String createUser(@RequestBody UserDTO user) {
System.out.println("Received user: " + user.getName());
// 返回JSON响应(Spring Boot自动序列化对象为JSON)
return "{\"status\": \"success\", \"message\": \"User created\"}";
}
}
关键点:
@RequestBody会将请求体的JSON字符串反序列化为UserDTO对象,要求JSON字段与DTO字段名一致(支持驼峰/下划线转换,需配置Jackson);- 返回对象时,Spring Boot默认用
Jackson库序列化为JSON,自动设置Content-Type: application/json。
(2)Python:Flask/Django框架
Python中,requests库是发送HTTP请求的利器,Flask/Django则用jsonify处理JSON响应。
示例:Flask接收JSON并返回JSON
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/user", methods=["POST"])
def create_user():
# request.json是Flask自动解析的JSON字典(无需手动json.loads)
data = request.json
print(f"Received user: {data.get('name')}")
# 返回JSON响应(jsonify会自动设置Content-Type为application/json)
return jsonify({"status": "success", "message": "User created"})
if __name__ == "__main__":
app.run(debug=True)
示例:Python用requests传JSON
import requests
url = "https://api.example.com/user"
data = {
"name": "王五",
"email": "wangwu@example.com"
}
# requests.post会自动将字典转为JSON字符串,并设置Content-Type
response = requests.post(url, json=data)
print("Response status:", response.status_code)
print("Response JSON:", response.json())
关键点:
- Flask中
request.json自动解析JSON请求体(需确保Content-Type正确); requests.post的json参数会自动处理序列化和Content-Type,比手动data=json.dumps(data)更方便。
(3)Go:标准库net/http
Go中需手动处理JSON序列化/反序列化,常用encoding/json包。
示例:Go接收JSON并返回JSON
package main
import (
"encoding/json"
"fmt"
"net/http"
)
// 定义结构体,与JSON字段对应(字段首字母必须大写,否则外部不可见)
type User struct {
Name string `json:"name"` // json标签用于映射JSON字段名
Email string `json:"email"`
}
func createUserHandler(w http.ResponseWriter, r *http.Request) {
// 1. 解析JSON请求体
var user User
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
// 2. 处理数据(示例:打印)
fmt.Printf("Received user: %+v\n", user)
// 3. 返回JSON响应
response := map[string]string{"status": "success", "message": "User created"}
w.Header().Set("


还没有评论,来说两句吧...