JavaScript松弛api jquery

JavaScript松弛api jquery,javascript,jquery,ajax,slack-api,Javascript,Jquery,Ajax,Slack Api,我的问题很简单,我想创建这个程序只需要几个小时。然而,现在我整天都在做这件事,试图找出我可能做错了什么 我所要做的就是用他们的博客向slack发布消息。我已经能够使用宽松裤成功地发送消息 这是测试输出的url https://slack.com/api/chat.postMessage?token=xoxp-xxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxxxx&channel=XXXXXXXX&text=Just%20need%20the%20url&

我的问题很简单,我想创建这个程序只需要几个小时。然而,现在我整天都在做这件事,试图找出我可能做错了什么

我所要做的就是用他们的博客向slack发布消息。我已经能够使用宽松裤成功地发送消息

这是测试输出的url

https://slack.com/api/chat.postMessage?token=xoxp-xxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxxxx&channel=XXXXXXXX&text=Just%20need%20the%20url&as_user=jheuman&pretty=1
然后,我决定使用我的文件系统提供的这个html文件在本地进行尝试

<!DOCTYPE html>
<html>
<head>
    <title>Testing Slack API</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <button onClick="test()">Test</button>
    <button onClick="test2()">Authorization Test</button>

<script>
    function test() {
        var apiUrl = "https://slack.com/api/chat.postMessage";
        var token = "xoxp-xxxxx...";//my token has been omitted for security;
        var channel = "#general";
        var text = "Testing slack api";
        var user = "jheuman";
        var actualToken = "Bearer " + token;


        $.ajax({
            headers: {
                'Authorization':actualToken,
                'Content-Type':'application/json'
            },

            data: JSON.stringify({
                "channel": channel,
                "text": text,
                "as_user": user
            }),
            dataType: 'json',
            processData: false,
            type: 'POST',
            url: apiUrl
        })
        .done(function(data) {
            console.log(JSON.stringify(data));
        })
        .fail(function(response) {
            console.log(JSON.stringify(response));
        });


    };

    function test2() {
        var apiUrl = "https://slack.com/api/auth.test";
        var token = "xoxp-xxxxx..."; //my token has been omitted for security
        var channel = "#general";
        var text = "Testing slack api";
        var user = "jheuman";
        var actualToken = "Bearer" + token;


    $.ajax({
        headers: {
            'Authorization':actualToken
        },
        type: 'POST',
            url: apiUrl,
    })
        .done(function(data) {
        console.log(JSON.stringify(data));
        })
        .fail(function(response) {
        console.log(JSON.stringify(response));
});


    };
</script>
所以根据朋友的建议,我在服务器上试用了它。我过去常在8887端口上菜。首先不设置cors标头,然后设置cors标头。两者都没有用。我收到了同样的错误

如您所见,我也尝试了auth.test调用,但收到了相同的错误

Slack特别声明他们更喜欢授权头,并且api可以处理json数据

我尝试过的其他事情:

数据中没有包含令牌的标头字段:

data: JSON.stringify({
    'token':actualToken,
    'channel': channel,
    'text': text,
    'as_user': user
}),
dataType: 'json',
processData: false,
type: 'POST',
url: apiUrl
收到的错误:

{"ok":false,"error":"invalid_form_data"}
{"ok":false,"error":"invalid_form_data"}
在没有“承载者”的数据中没有带令牌的头字段:

data: JSON.stringify({
    'token':token,
    'channel': channel,
    'text': text,
    'as_user': user
}),
dataType: 'json',
processData: false,
type: 'POST',
url: apiUrl
收到的错误:

{"ok":false,"error":"invalid_form_data"}
{"ok":false,"error":"invalid_form_data"}
我已经调查过但认为不会影响结果的事情

那么,我如何让这个职位申请生效呢

我没有设置jquery或ajax,这只是我在过去使用过的,所以如果您有不同的请求库要使用,我洗耳恭听


如果您需要更多信息,我将尝试提供给您

您需要使用适当的CORS标题回复CORS飞行前信息,以使此工作正常进行。其中之一就是访问控制允许标头。该标头需要包含与访问控制请求标头相同的值(或更多)

更详细地解释此设置

headers: {
                'Authorization':actualToken,
                'Content-Type':'application/json',
                'Access-Control-Allow-Headers':'x-requested-with'
            },

由于正确配置CORS以发送内容类型为
application/json
的数据可能很棘手,因此我建议将请求发送为
application/x-www-form-urlencoded
,这是AJAX的默认设置

例如:

var apiUrl = "https://slack.com/api/chat.postMessage";
var token = MY_TOKEN;
var channel = "general";
var text = "Testing slack api";
var user = "jheuman";

 $.ajax({                   
    data: {
        "token": token,
        "channel": channel,
        "text": text,
        "as_user": user
    },                      
    dataType: 'text',
    type: 'POST',           
    url: apiUrl,
    error: function(xhr,status,error){              
        console.log("error: " + error);
    },
    success: function(data) {
        console.log("result: " + data);
    }
});
如果您得到CORS错误,您可以添加
crossDomain:true


此解决方案经过测试,在普通浏览器中运行时可以正常工作。

Aha,那么您认为如果我使用nodejs,调用会正常进行吗?这是我的最终目标,只是想在我尝试将其放在服务器上之前进行测试。你是否尝试从频道名称中删除哈希?@vol7ron我使用URL末尾的7位数字,但不想在这里发布,因此这不是问题,但谢谢你。基于你的错误消息,我认为这是一个很长的机会;)我仍然需要更透彻地阅读您的问题,但我很好奇您是否无法创建一个带有令牌的公共空闲通道,以便其他人进行更透彻的测试。CORS是一个笨拙的野兽,这里的一些答案似乎应该有效。您的服务器需要
访问控制允许源代码的标题:
调用的API正在供应商服务器上运行,他无法控制该服务器。我想Brian是对的。设置cors是在服务器端完成的,这就是为什么我很难找到解决问题的方法,因为我无法更改松弛的服务器。我试过了,但没用。但是谢谢你的帮助!很乐意帮忙。顺便说一句,我不建议在浏览器中运行此代码,因为它会暴露您的令牌。