【问题标题】:I have two JQuery Ajax API calls to a REST API, one doesn't work why?我有两个对 REST API 的 JQuery Ajax API 调用,为什么一个不起作用?
【发布时间】:2022-01-19 02:03:33
【问题描述】:

我正在向服务器发出获取 REST api 请求。服务器包含我希望通过参数启动的自动化作业。

var jobURL = "https://hostname/api/v1/tasks"; 

$.ajax({
    url: jobURL,
    method: 'GET',
    async: false,
    contentType: "application/json",
    data: {
        name: '*JOBNAME*'
    },
    headers: {
        'Authorization': 'Bearer '+ obj.access_token,
        'Content-type': 'application/x-www-form-urlencoded',
        Accept:'application/json'
    },
    success: function(data){
        taskname_obj = data    // result
}

我正在按照服务器产品的文档执行此操作,并且它正在运行。

我有一个成功的请求,在“taskname_obj”变量中返回了项目。 话虽如此,我正在尝试将相同类型的代码用于另一个调用。

// THIS IS WORKING TO JOB WITHOUT PARAMS.

        // Let's run the job. 
        $.ajax({
            url: jobURL,
            method: 'POST',
            async: false,
            headers: {
                'Authorization': 'Bearer '+ obj.access_token
            },
            success: function(data){
                taskname_obj2 = data    // result
            }
        })

所以我在做上面的代码

我又成功了,我可以开始我的工作了。我有成功的迹象返回到taskname_obj2

话虽如此,我正试图从参数开始。我想我必须把它放到“数据:”项中,然后我大喊使用 JSON。所以...我执行以下操作...

var payload = { 
    USER_ID: "",
    BEGDATE: "060121",
    ENDDATE: "121521"
};

$.ajax({
    url: jobURL,
    method: 'POST',
    async: false,
    contentType: 'application/json',
    data: payload,
    headers: {
        'Authorization': 'Bearer '+ obj.access_token,
        'Content-type': 'application/x-www-form-urlencoded',
        Accept:'application/json'
    },
    success: function(data){
        taskname_obj2 = data    // result
    }
})

这不起作用。我从服务器收到不支持的媒体类型的 415 错误。我也尝试不将 JSON.stringify 用于数据项,但我也得到了 415。

我想我没有正确地告诉它如何阅读我的 JSON。谁能帮我理解我做错了什么?

我也尝试添加此contentType: 'application/json', 无济于事。

更新: 使用 BAMARs 技术返回 422 错误。

$.ajax({
    url: jobURL,
    method: 'POST',
    async: false,
    contentType: 'application/json',
    dataType: 'json',
    data: JSON.stringify(payload),
    headers: {
        'Authorization': 'Bearer '+ obj.access_token
    },
    success: function(data){
        taskname_obj2 = data    // result
    }
})

【问题讨论】:

  • GET 请求不需要content-type,因为它不发送任何内容。
  • 在 POST 请求中,为什么应该使用 URL 编码的 JSON.stringify(payload)
  • 老实说我不知道​​,我不是一直都在做 jquery。我正在尝试将 powershell 转换为 jquery 以进行 chrome 扩展。感谢有关获取请求的提示,我删除了它并且确实有效。有问题的孩子是 POST,我从中删除了 stringify。也谢谢你
  • @Barmar GET 请求包含data。不是作为正文发送的吗?
  • @jabaa 不,它没有。 data: 值作为 URL 中的查询参数发送。

标签: javascript jquery json rest


【解决方案1】:

去掉 Content-typeAccept 标头。使用contentType:dataType: 选项来指定这些。

而且由于 API 需要 JSON 输入,所以应该是 contentType: "application/json"

$.ajax({
    url: jobURL,
    method: 'POST',
    async: false,
    contentType: 'application/json',
    dataType: 'json',
    data: JSON.stringify(payload),
    headers: {
        'Authorization': 'Bearer '+ obj.access_token
    },
    success: function(data){
        taskname_obj2 = data    // result
    }
})

【讨论】:

  • 参数应该是taskIdparams。为什么要发送USER_IDBEGDATEENDDATE
  • 那些应该是params 中的值吗?你需要一个像 {taskId: xxx, params: {USER_ID: "", BEGDATE: "060121", ENDDATE: "121521"}} 这样的对象
  • 任务 ID 进入 URL。参数是我在我的 powershell 脚本中作为哈希表发送的任何内容。如果这有助于回答这个问题,我可以发布那个确实有效的脚本
  • 哦,我误解了文档。
  • 使用 DevTools 的 Network 选项卡查看响应正文,我认为那里应该有更多关于验证错误的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多