带有JSON值的表单REST API是一种将JSON数据通过表单形式发送到服务器的API设计方式。这种方式结合了传统的表单提交和现代JSON数据交换的优势。
application/x-www-form-urlencoded
格式POST /api/users HTTP/1.1
Content-Type: application/x-www-form-urlencoded
data=%7B%22name%22%3A%22John%22%2C%22age%22%3A30%2C%22address%22%3A%7B%22city%22%3A%22New%20York%22%7D%7D
multipart/form-data
格式POST /api/users HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="json_data"
{"name":"John","age":30,"address":{"city":"New York"}}
------WebKitFormBoundary7MA4YWxkTrZu0gW--
application/json
格式虽然这不是严格意义上的表单,但也是常见做法:
POST /api/users HTTP/1.1
Content-Type: application/json
{"name":"John","age":30,"address":{"city":"New York"}}
原因:
解决方案:
原因:
解决方案:
原因:
解决方案:
// 使用FormData发送JSON数据
async function submitForm() {
const formData = new FormData();
const jsonData = {
name: document.getElementById('name').value,
age: document.getElementById('age').value,
address: {
city: document.getElementById('city').value
}
};
formData.append('data', JSON.stringify(jsonData));
try {
const response = await fetch('/api/users', {
method: 'POST',
body: formData
});
const result = await response.json();
console.log(result);
} catch (error) {
console.error('Error:', error);
}
}
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
// 解析application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
// 解析multipart/form-data
const multer = require('multer');
const upload = multer();
app.post('/api/users', upload.none(), (req, res) => {
try {
const jsonData = JSON.parse(req.body.data);
console.log('Received data:', jsonData);
// 处理数据...
res.json({ success: true, data: jsonData });
} catch (error) {
res.status(400).json({ success: false, error: 'Invalid JSON data' });
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
@app.route('/api/users', methods=['POST'])
def handle_form():
try:
json_data = json.loads(request.form.get('data'))
print("Received data:", json_data)
# 处理数据...
return jsonify({"success": True, "data": json_data})
except json.JSONDecodeError:
return jsonify({"success": False, "error": "Invalid JSON data"}), 400
if __name__ == '__main__':
app.run(port=5000)
通过这种方式,您可以构建既灵活又强大的REST API,同时保持与传统系统的兼容性。