django-rest-framework accept JSON data?
Question:
I have created RESTFul APIs using django-rest-framework. 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:
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
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:
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.
You need to do two step to done this issue:
- Add
Content-Type
header with application/json
value
- 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
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:
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" },
Couple of things to do if you want to accept JSON Data using Django Rest Framework.
-
Make sure application/json headers are sent:
'Content-Type: application/json'
-
JSON Parser is selected in settings.py
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
],
}
I have created RESTFul APIs using django-rest-framework. 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:
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
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:
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.
You need to do two step to done this issue:
- Add
Content-Type
header withapplication/json
value - Add
Authorization
header withToken {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
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:
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" },
Couple of things to do if you want to accept JSON Data using Django Rest Framework.
-
Make sure application/json headers are sent:
'Content-Type: application/json'
-
JSON Parser is selected in
settings.py
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
],
}