【问题标题】:How to add form-data to Laravel Echo request?如何将表单数据添加到 Laravel Echo 请求?
【发布时间】:2020-10-06 17:17:03
【问题描述】:

我正在尝试使用 Laravel Echo 请求发送一些数据

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'somekey',
    wsHost: '127.0.0.1',
    wsPort: 6001,
    encrypted: false,
    disableStats: true,
    forceTLS: false,
    authEndpoint: 'http://127.0.0.1:8000/broadcasting/auth',

    'form-data': {          // I tried data, dataForm, dataform
        someData: '123',    // this doesn't seem to work                
    },                  
});

我已经了解了如何将自定义标头添加到请求中

auth: {
    headers: {
          token: '123'
    }
}

有没有办法以类似的方式添加表单数据?

编辑

当我在 DevTools 中检查网络请求时,我可以看到 Echo 向服务器发送了两个 formData 属性。所以我认为必须有一种方法可以将附加属性附加到现有的formData 对象中

【问题讨论】:

  • 如果你这样做会不会起作用authEndpoint : 'http://127.0.0.1:8000/broadcasting/auth?someData=123'
  • @IslamElshobokshy 好吧,它会,以及将数据作为自定义标头发送,但这不是很干净。当我在 DevTools 中检查网络请求时,我可以看到 Echo 向服务器发送了两个 formData 属性。所以我认为必须有一种方法可以将附加属性附加到现有的formData 对象中
  • 您可以尝试使用data 而不是您的'form-data' 发送数据吗?也可以试试formDatadata: {'formData' : { ... }}
  • 我尝试了所有版本都无济于事:(我可能应该在问题中说...

标签: javascript multipartform-data form-data laravel-echo


【解决方案1】:

有没有办法以类似的方式添加表单数据?

简单的答案是——不

Laravel Echo 没有在参数集中实现该功能的功能。

我们可以在开发工具请求中看到Form Data 对象的原因是因为 pusher-js 在向服务器发出请求之前添加了它们。为了实现这一点,我们必须在请求执行之前操作推送器 API,但这偏离了这个线程的原始主题。

因此,如果您想将数据发送到服务器,最简单的方法是添加原始问题中指出的自定义标头。

...
auth: {
    headers: {
          token: '123'
    }
}
...

【讨论】:

    【解决方案2】:

    编辑 1

    我真的不确定这是否真的有效,但你可以尝试一下吗

    class LaravelEcho extends Echo {
        constructor(options) {
            super(options);
    
            this.setformData();
        }
    
        setformData(formData = this.options.formData) {
            if (formData) {
                let path =
                    "?" +
                    Object.entries(formData)
                        .map((ch) => ch.join("="))
                        .join("&");
    
                this.options.authEndpoint += path;
                this.connector.options = this.options;
                // since you are using pusher
                if (this.connector.pusher) {
                    this.connector.pusher.options = this.options;
                }
                // maybe also for socket.io too?
                else if (this.connector.socket) {
                    this.connector.socket.options = this.options;
                }
            }
        }
    }
    
    let myEcho = new LaravelEcho({
        broadcaster: "pusher",
        key: "somekey",
        wsHost: "127.0.0.1",
        wsPort: 6001,
        encrypted: false,
        disableStats: true,
        forceTLS: false,
        authEndpoint: "http://127.0.0.1:8000/broadcasting/auth",
    
        formData: {
            foo: "bar",
            username: "username",
            password: "password",
        },
    });
    
    console.log(myEcho);
    

    我知道这真的不是你想要的方式。我试图按照@Islam 在评论中所说的那样做到这一点,我真的想知道如果我们在创建后覆盖选项,这是否会像这样工作:)

    我正在研究这个。 here 我看到有一个headers 选项如下:

    private _defaultOptions: any = {
        auth: {
            headers: {},
        },
        authEndpoint: '/broadcasting/auth',
        broadcaster: 'pusher',
        csrfToken: null,
        host: null,
        key: null,
        namespace: 'App.Events',
    };
    

    这是Connecter 的默认选项,在constructor 内部,它还为csrfToken here 设置了一个身份验证标头

    所以我猜你在创建 Laravel/Echo 时可能会这样做,

    window.Echo = new Echo({
        broadcaster: 'pusher',
        key: 'somekey',
        wsHost: '127.0.0.1',
        wsPort: 6001,
        encrypted: false,
        disableStats: true,
        forceTLS: false,
        authEndpoint: 'http://127.0.0.1:8000/broadcasting/auth',
        auth: {
            headers: {
               'X-CSRF-TOKEN': 'your-csrf-token'
               'your-header': 'with-value'
            }
        }    
    });
    

    希望这对你有用。请务必告诉我! :)

    顺便说一句,我没有测试环境,所以我从来没有测试过..

    【讨论】:

    • 这正是我上面指出的。恐怕您的回答没有解决有关dataForm 主题的实际问题
    • 射击,我虽然他看起来像这样,但现在我看到了它 :( 很好找这个我从来没有在代码中看到额外的 dataForm 属性选项。也许会产生拉力关于这个主题的请求会起作用吗?
    • 通过深入挖掘代码,我现在了解到我在请求中看到的 formData 与 Laravel Echo 无关。 Laravel 正在使用 pusher-js,它反过来将 formData 属性添加到请求中。所以默认情况下,Laravel Echo 没有任何方法向请求添加任何 formData 参数。我错误地认为有一种优雅的方式可以实现这一目标
    • 嗯,是的,我也找不到与 formData 相关的任何内容,但扩展 laravel-echo 可以解决我猜的问题。你能试试Edit 1吗?我真的想知道它是否以这种方式工作:)
    • 不幸的是,它不起作用。表单数据保持不变,我在请求中根本看不到foo。可能最简单的方法是去操纵 pusher 本身。像window.Echo.connector.pusher... 这样的东西。但为此,我将不得不提出另一个问题,因为我们会偏离这里的主题。我想这个问题注定了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2017-01-25
    • 2016-03-30
    • 2021-01-16
    • 2016-04-23
    • 2020-09-04
    • 2015-09-17
    相关资源
    最近更新 更多