Javascript jqueryajaxjsonp返回400个错误请求
我正在尝试使用jQueryAjax将字符串化JSON发送到本地地址 此地址正在等待接收JSON数据 但是,一旦发送,它将返回“400错误请求”Javascript jqueryajaxjsonp返回400个错误请求,javascript,jquery,ajax,http-status-code-400,Javascript,Jquery,Ajax,Http Status Code 400,我正在尝试使用jQueryAjax将字符串化JSON发送到本地地址 此地址正在等待接收JSON数据 但是,一旦发送,它将返回“400错误请求” 更新 我在本地服务器上找到了失败的代码: static int event_handler(sb_Event* e) { const struct handler_desc* descs = NULL; handler_cb* handler = NULL; char* in_data; size_t in_size;
更新 我在本地服务器上找到了失败的代码:
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;
}
静态int事件处理程序(sb\u事件*e){
const struct handler_desc*descs=NULL;
handler_cb*handler=NULL;
字符*in_数据;
尺寸(单位:英寸);
大小/数量;
尺寸i;
int ret;
如果(e->type!=SB\u EV\u请求){
ret=某人恢复正常;
去做;
}
if(strcasecmp(e->method,“GET”)==0){
descs=s_get_处理程序;
计数=数组大小(s\u get\u处理程序);
}else if(strcasecmp(e->method,“POST”)==0){
descs=s_post_处理器;
计数=数组大小(s\U post\U处理程序);
}
如果(!descs){
错误的请求:
kick_错误(e->stream,400,“错误请求”,“不支持的方法”);
ret=某人恢复正常;
去做;
}
对于(i=0;ipath,descs[i].path)=e->path){
handler=descs[i].handler;
打破
}
}否则{
if(strcmp(e->path,descs[i].path)==0){
handler=descs[i].handler;
打破
}
}
}
if(!handler){
转到坏_请求;
}
in_data=sb_获取内容数据(e->stream,&in_size);
(*处理程序)(e->stream,e->method,e->path,in_数据,in_大小);
ret=某人恢复正常;
完成:
返回ret;
}
在我看来,这似乎无法获取
s\u get\u处理程序
或s\u post\u处理程序
?最有可能的解决方案:将processData:false添加到参数中,这将使传递给数据的字符串未经处理,应作为原始正文发送:
if (res.success) {
$.ajax({
url: 'http://192.168.2.10:12800/api/install',
...
processData: false,
data: JSON.stringify({
...
但只要我知道就不能发送JSONP POST请求,因为JSONP请求是如何发出的:使用动态创建的标记。这些请求将始终是GET请求,因此您不能发送原始实体。在您的开发者网络选项卡上检查它(请参见下一页)。如果要发送POST请求,则必须使用非JSONP请求,并在192.168.2.10:12800服务器上正确设置CORS。这是在该服务器上设置的响应头访问控制允许来源:其中siteA.com是调用方页面所在的域。查看更多关于
我必须提到,JQuery可能使用了一个技巧,但我认为JSONP与发送POST请求不兼容,因为它是通过创建标记来请求的
您可以使用浏览器中开发人员栏上的“网络”选项卡(您知道,使用F12打开)检查此解决方案和其他请求如何更改。例如,激活processData:false应更改url和请求正文
不太可能的解决方案:根据您的API,更改数据以指定至少一个参数,这样字符串化的数据将在一个命名参数下发送,该参数与最常用的标准化参数有关protocol://host/path/resource?param=value¶m=value¶m=value url格式
例如,如果要在名为json的参数下发送数据,则应使用:
if (res.success) {
$.ajax({
url: 'http://192.168.2.10:12800/api/install',
...
data: {
json: JSON.stringify({
'type': 'direct',
'packages': packages
})
},
...
原因:如果分析错误的URL,请将其拆分为多个部分:
http://192.168.2.10:12800/api/install
第一个论点:
?callback=jQuery3410603622444131205_1578188027542
&_=1578188027543
第二个(格式不正确,没有参数名):
最后论点:
?callback=jQuery3410603622444131205_1578188027542
&_=1578188027543
第一个是JQuery动态回调,最后一个是反缓存,看起来还可以,但第二个部分的格式不正确。当然,您可以使用自己的url方案,但标准方案不使用没有参数名的json数据形式。所以,您可能希望在POST-raw body中发送json数据,或者发送一个命名参数,并将json字符串化为值
相关问题:和最有可能的解决方案:将processData:false添加到参数中,这将使传递给数据的字符串未经处理,应作为原始正文发送:
if (res.success) {
$.ajax({
url: 'http://192.168.2.10:12800/api/install',
...
processData: false,
data: JSON.stringify({
...
但只要我知道就不能发送JSONP POST请求,因为JSONP请求是如何发出的:使用动态创建的标记。这些请求将始终是GET请求,因此您不能发送原始实体。在您的开发者网络选项卡上检查它(请参见下一页)。如果要发送POST请求,则必须使用非JSONP请求,并在192.168.2.10:12800服务器上正确设置CORS。这是在该服务器上设置的响应头访问控制允许来源:其中siteA.com是调用方页面所在的域。查看更多关于
我必须提到,JQuery可能使用了一个技巧,但我认为JSONP与发送POST请求不兼容,因为它是通过创建标记来请求的
您可以使用浏览器中开发人员栏上的“网络”选项卡(您知道,使用F12打开)检查此解决方案和其他请求如何更改。例如,激活processData:false应更改url和请求正文
不太可能的解决方案:根据您的API,更改数据以指定至少一个参数,这样字符串化的数据将在一个命名参数下发送,该参数与最常用的标准化参数有关protocol://host/path/resource?param=value¶m=value¶m=value url格式
例如,如果要在名为json的参数下发送数据,则应使用:
if (res.success) {
$.ajax({
url: 'http://192.168.2.10:12800/api/install',
...
data: {
json: JSON.stringify({
'type': 'direct',
'packages': packages
})
},
...
原因:如果分析错误的URL,请将其拆分为多个部分:
http://192.168.2.10:12800/api/install
第一个论点:
?callback=jQuery3410603622444131205_1578188027542
&_=1578188027543
第二个(格式不正确,没有参数名):
最后论点:
?callback=jQuery3410603622444131205_1578188027542
&_=1578188027543
第一个是JQuery动态回调,最后一个是反缓存,看起来还可以,但第二个部分的格式不正确。当然,您可以使用自己的url方案,但标准方案不使用没有参数名的json数据形式。因此,您可能希望在POST中发送json数据