13

I'm trying out Vue 2.0 and axios and I've got a little issue. When I try to send a post request using axios to my post.php file the $_POST array is always empty.

Post function:

doPost: function() {
  console.log("post in progress")
  axios.post('api/post.php', {
      title: 'foo',
      body: 'bar',
      userId: 1
  })
  .then(response => {
    console.log(response)
    console.log(response.data)
    this.filter = response.data
  })
  .catch(e => {
    this.errors.push(e)
  })
}

post.php

<?php
header('Content-Type: application/x-www-form-urlencoded');


echo json_encode($_POST);
?>

The request is completed with status 200 but returns an empty object "[]"

Note: when I change the post endpoint to jsonplaceholder tool it works fine.

2
  • 1
    I posted something similar a while ago, maybe it'll help stackoverflow.com/questions/41457181/… Commented Jun 28, 2017 at 10:21
  • 1
    That Content-Type header makes absolutely no sense ... Commented Jun 28, 2017 at 10:28

3 Answers 3

18

I think you can try this, it should be the data-type problem.

var data = new FormData();
data.append('title', 'foo');
data.append('body', 'bar');

axios.post('api/post.php', data)
    .then(response => {
        console.log(response)
        console.log(response.data)
        this.filter = response.data
    })
    .catch(e => {
        this.errors.push(e)
});
Sign up to request clarification or add additional context in comments.

1 Comment

This worked after i changed it to: axios.post('api/post.php', data)
11

The data that is send with axios is not put into PHP's $_POST. Instead, it is in the request body and most likely in json format. To get it, try the following code:

function getRequestDataBody()
{
    $body = file_get_contents('php://input');

    if (empty($body)) {
        return [];
    }

    // Parse json body and notify when error occurs
    $data = json_decode($body, true);
    if (json_last_error()) {
        trigger_error(json_last_error_msg());
        return [];
    }

    return $data;
}


$data = getRequestDataBody();
var_dump($data)

Or you could use FormData like the other answer suggests.

Comments

3

For me the problem was that I was using http instead of https in the url. The server returned http status code Permanently moved (to the https site). A browser or command line client (curl) follow these redirects. My code did not. Solution was to use https in the url.

1 Comment

YES! That's it! Can't believe that all this hassle is because of an redirect. Thank you so much for mentioning this.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.