Javascript jqueryajaxjsonp返回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;

我正在尝试使用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;
    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数据