django-rest-framework accept JSON data?

Question:

I have created RESTFul APIs using . The user endpoint is: /api/v1/users

I want to create a new user, so I send the user data in JSON format:

{
    "username": "Test1",
    "email": "[email protected]",
    "first_name": "Test1",
    "last_name": "Test2",
    "password":"12121212"
}

I am using Google Chrome extension Postman to test the API. But, after sending the request, the user data is not saving. The response contains this error:

{
    "detail": "Unsupported media type "text/plain;charset=UTF-8" in request."
}

This is what the request details look like in Postman:

Postman API request to django-rest-framework error

Asked By: Elisa

||

Answers:

You need to define content type by setting the appropriate headers. In case of Postman you need to set the following values under url field:

Header: “Content-Type”

Value: application/json

Answered By: mariodev

You have missed adding the Content-Type header in the headers section. Just set the Content-Type header to application/json and it should work.

See the below image:

postman

Also, you might also need to include a CSRF token in the header in case you get an error {"detail": "CSRF Failed: CSRF token missing or incorrect."} while making a POST request using Postman. In that case, add an X-CSRFToken header also with value as the CSRF token value.

Answered By: Rahul Gupta

You need to do two step to done this issue:

  1. Add Content-Type header with application/json value
  2. Add Authorization header with Token {YOUR_CUSTOM_TOKEN} value to pass CSRFToken

Note: if you want to authenticate with session, you don’t need to do second step, but if you want use this API for mobile, you have to pass Authorization header to server

I hope it helps

Answered By: Moe Far

I’m posting this answer in case someone is facing a problem like mine.

I’m working on a Front-End app using Angular 2 with an API made with Django Rest Framework and I used to send requests with the following headers:

'Content-Type': 'application/json'

And it was working fine until I tried it on Fire Fox and I couldn’t load the needed data and I solved it with adding the following headers

'Content-Type': 'application/json',
'Accept': 'application/json'

Here’s an explanation, Content-Type tells the server what is the content type of data is while Accept tells it what content type the client side will accpet.

Here’s a nice clear answer about this issue:

https://webmasters.stackexchange.com/questions/31212/difference-between-the-accept-and-content-type-http-headers

Answered By: Khaled Al-Ansari

I had to add the following to get this to work (I’m using node-fetch btw from the client side to do a POST):

supportHeaderParams: true,
headers: { "Content-Type": "application/json; charset=UTF-8" },
Answered By: Harlin

Couple of things to do if you want to accept JSON Data using Django Rest Framework.

  1. Make sure application/json headers are sent:
    'Content-Type: application/json'

  2. JSON Parser is selected in settings.py

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
        ],    
    }
Answered By: kashaziz