【发布时间】:2020-04-23 01:38:10
【问题描述】:
我正在尝试使用 jQuery AJAX 将字符串化的 JSON 发送到本地地址。
此地址正在等待接收 JSON 数据。
但是,一旦发送,它就会返回“400 Bad Request”。
//response received as: {"success":"true","packages":["https://example.com/link1.pkg","https://example.com/link2.pkg","https://example.com/link3.pkg"]}
var res = JSON.parse(response);
var packages = [];
$.each(res.packages, function (i, item) { // put links in array
packages.push(item);
});
if (res.success) {
$.ajax({
url: 'http://192.168.2.10:12800/api/install',
type: 'POST',
headers: {
'Access-Control-Allow-Origin': '*', // cors
'Content-Type': 'application/json'
},
contentType: 'application/json; charset=utf-8',
dataType: 'jsonp',
data: JSON.stringify({
'type': 'direct',
'packages': packages
}),
success: function (response) {
$('#dynamicModal').find('#response').html('<p>Packages sent!</p>');
},
error: function (response) {
$('#dynamicModal').find('#response').html('<p>Error occurred while sending.</p>');
}
});
} else {
$('#dynamicModal').find('#response').html('<p>Error occurred while gathering links.</p>');
}
我在 Google 上检查了很多链接,90% 的人说 JSON 没有被字符串化,但我的是。我没有想法,我希望有人可以帮助我并可能看到这个问题。
这是完整的控制台错误:
GET http://192.168.2.10:12800/api/install?callback=jQuery3410603622444131205_1578188027542&{%22type%22:%22direct%22,%22packages%22:[%22http://example.com/EXAMPLE_0.pkg%22,%22http://example.com/EXAMPLE_1.pkg%22,%22http://example.com/EXAMPLE_2.pkg%22,%22http://example.com/EXAMPLE_3.pkg%22,%22http://example.com/EXAMPLE_4.pkg%22,%22http://example.com/EXAMPLE_5.pkg%22,%22http://example.com/EXAMPLE_6.pkg%22]}&_=1578188027543 net::ERR_ABORTED 400 (Bad request)
更新
我在本地服务器上找到了失败的代码:
static int event_handler(sb_Event* e) {
const struct handler_desc* descs = NULL;
handler_cb* handler = NULL;
char* in_data;
size_t in_size;
size_t count;
size_t i;
int ret;
if (e->type != SB_EV_REQUEST) {
ret = SB_RES_OK;
goto done;
}
if (strcasecmp(e->method, "GET") == 0) {
descs = s_get_handlers;
count = ARRAY_SIZE(s_get_handlers);
} else if (strcasecmp(e->method, "POST") == 0) {
descs = s_post_handlers;
count = ARRAY_SIZE(s_post_handlers);
}
if (!descs) {
bad_request:
kick_error(e->stream, 400, "Bad request", "Unsupported method");
ret = SB_RES_OK;
goto done;
}
for (i = 0; i < count; ++i) {
if (descs[i].need_partial_match) {
if (strstr(e->path, descs[i].path) == e->path) {
handler = descs[i].handler;
break;
}
} else {
if (strcmp(e->path, descs[i].path) == 0) {
handler = descs[i].handler;
break;
}
}
}
if (!handler) {
goto bad_request;
}
in_data = sb_get_content_data(e->stream, &in_size);
(*handler)(e->stream, e->method, e->path, in_data, in_size);
ret = SB_RES_OK;
done:
return ret;
}
在我看来,这似乎无法获得 s_get_handlers 或 s_post_handlers?
【问题讨论】:
-
通常您不会对
data字段进行字符串化,您是否尝试过为该字段提供原始 json 对象?您是否还注意到您指定了 POST 但控制台错误显示 GET?看起来服务器端可能只希望处理带有 GET 请求的 URL。 -
@NathanHawks 我已经取消了
data字段的字符串化并将 POST 更改为 GET 但结果没有更改。 GET可以是返回结果吗? -
不,返回结果既不是POST也不是GET。好的,所以我不建议您将 AJAX 请求更改为 GET。相反,我认为您应该在服务器端找到需要 GET 的代码,并将 that 更改为 POST。无论发生什么,400 表示您发送了一个畸形的请求。归结为:您发送的 var 不是预期的,或者缺少 var,或者方法 (GET/POST) 错误。
-
@NathanHawks 你好 Nathan,我已经添加了失败的服务器的相关代码。
-
你的客户端代码全是废话,不能发出POST请求or用JSON的时候设置请求头,可以设置请求头的时候,
Access-Control-Allow-Origin不是其中之一:它是一个 response 标头。
标签: javascript jquery ajax http-status-code-400