我有一些 json 数据,已使用 $.ajax 发布到 API,但我想更新它以使用 fetch API。不过,我似乎设置了 Fetch API 请求最终返回 403,所以我一定错过了一些东西,但我无法解决。
阿贾克斯请求:
$.ajax({
type: 'POST',
url: url,
data: {
'title': data.title,
'body': data.body,
'csrfmiddlewaretoken': csrf_token,
'request_json': true
},
success: function (data) {
console.log(data)
}
});
Run Code Online (Sandbox Code Playgroud)
获取尝试(众多尝试之一):
let payload = {
'title': data.title,
'body': data.body,
'csrfmiddlewaretoken': csrf_token,
'request_json': true
}
let request = new Request(url, {
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: JSON.stringify( payload )
});
fetch(request)
.then((response) => {
if (!response.ok) {
throw Error(response.statusText);
}
return response; …Run Code Online (Sandbox Code Playgroud) 我正在尝试从React / Redux / Django webapp删除jQuery,并用$.ajaxFetch API 替换该方法。我或多或少地使我的所有GET请求都能正常工作,并且似乎能够实现POST请求,但似乎无法以将POST数据实际放入Django request.POST对象的方式格式化请求。每次我点击/ sign_in视图时,该request.POST对象都是空的。我整个应用程序的后端都是使用Django表单构建的(没有Django模板,只有React控制的组件),我真的不想不必重写所有视图以使用request.body或request.data。
这是我认为可能相关的所有代码,请告诉我是否还有更多有用的代码:
这是咖喱函数,用于构建完整的POST数据并附加CSRF令牌:
const setUpCsrfToken = () => {
const csrftoken = Cookies.get('csrftoken')
return function post (url, options) {
const defaults = {
'method': 'POST',
'credentials': 'include',
'headers': {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/x-www-form-urlencoded'
}
}
const merged = merge(options, defaults)
return fetch(url, merged)
}
}
export const post = setUpCsrfToken()
Run Code Online (Sandbox Code Playgroud)
这是我在React应用程序中使用的API方法:
export const signIn = data => {
return post('/api/account/sign_in/', data)
} …Run Code Online (Sandbox Code Playgroud) 我有一个输入字符串,将要么是JSON数据包,鼻翼:
{"PHONE":"555-513-4318","FIRSTNAME":"Austin","ARTISTID":"2","LASTNAME":"Weber"}
Run Code Online (Sandbox Code Playgroud)
或查询字符串,ala:
phone=555-513-4318&firstname=Austin&artistid=2&lastname=Weber
Run Code Online (Sandbox Code Playgroud)
为了我的目的,我需要始终使用后一种格式; 所以当它是JSON数据时,我需要将它转换为查询字符串.它是用户输入,所以我不能保证它将是一个或另一个.
我正在使用jQuery,并且有以下代码,它可以工作.我只是想知道是否有更好的方法来解决它.
var data = '';
try {
data = $.param($.parseJSON($("#content").val()));
} catch (e) {
data = $("#content").val();
}
//... now do stuff with the `data` var...
Run Code Online (Sandbox Code Playgroud)
这里的逻辑是,如果字符串不是有效的JSON,那么$.parseJSON()将抛出异常,并且数据将仅设置为用户输入的原始值.