Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 5: How Can a Form Submit with Custom HTTP Headers?

I cant seem to find any information on how to get a webform in Rails 5 to submit with custom headers. I would like the URL to which I am sending a PUT request to also receive some custom headers. I am surprised that there is no argument for form_for for this.

I could accomplish this by submitting the form to an action where I modify the headers there, e.g., request.headers['my-header'] = 'xyz'. I would then have to make the PUT request from within this "middle" controller action, and I feel this additional step is clunky and unconventional.

I could also use jQuery to bind to the submit click, and submit the form data after adding the headers via JavaScript. Id rather not involve another layer (i.e., JS) in this process.

I would rather not do either. Is there a way I can just use the Rails form helpers (or some controller helper) to add some custom headers to the request made by the form submission?

like image 392
Todd Avatar asked Feb 02 '17 21:02

Todd


People also ask

Can HTTP headers be custom?

There are many uses for custom headers and they are quite commonly used. Even if you aren't using a CDN or haven't specifically defined any custom HTTP headers on your origin server, you may still be sending responses with custom headers.

How do I add a custom header in HTTP spring boot?

To set the custom header to each response, use addHeader() method of the HttpServletResponse interface. That's all about setting a header to all responses in Spring Boot.


1 Answers

Rails does not have any tags that allows us to do that and therefore cannot add custom headers to your request.

In fact, you cannot set custom headers in html forms without xhr plugins, You have to use it with ajax. Something like this:-

<%= form_tag("/your_url", method: :post, :remote => true, :html => { id: "form-id" }) do |f| %>
    ...your form here...
<% end %>

and then you ajax code:-

$('#form-id').submit(function() {
    var valuesToSubmit = $(this).serialize();
    $.ajax({
        type: "POST",
        url: $(this).attr('action'),
        data: valuesToSubmit,
        headers: { 'Xmlrpc-Token': 'value' , 'Token': 'another_value'}
    }).success(function(response){
        //success code
    });
    return false;
});

Using only remote: true in rails will make ajax call, but you want to be able to customize it using the code above.

like image 135
rohan Avatar answered Sep 25 '22 12:09

rohan