39

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

1

6 Answers 6

64

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.

Sign up to request clarification or add additional context in comments.

Comments

11

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

Comments

7

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

Comments

1

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

Comments

1

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',
        ],    
    }

Comments

0

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" },

Comments

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.