Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

POST request works in Postman but not in Python

Tags:

python

json

When I make this POST request in Postman, I get the data. When I do it in Python 2.7 (using a Jupyter notebook), I get the error "No JSON object could be decoded". What am I doing wrong and how can I make it work?

import json
import requests
url = 'http://api.scb.se/OV0104/v1/doris/en/ssd/BE/BE0101/BE0101A/BefolkningNy'

headers={'content-type': 'application/json'}
payload = {  
"query": [
 {       
 "code": "ContentsCode",
  "selection": {        
    "filter": "item",         
    "values": [          
      "BE0101N1"         
    ]      
   }    
},    
{      
   "code": "Tid",
   "selection": {        
   "filter": "item",         
  "values": [           
   "2010",          
   "2011"         
   ]      
  }    
 },
 {      
  "code": "Region",
    "selection": {        
    "filter": "item",         
   "values": [           
   "01"         
   ]      
  }    
 }   
],  
"response": {    
  "format": "json"   
 }
}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

r = requests.post(url, data=payload)
print(r.text)
print(r.json())

The manual for the api is here, but it is not much help:

http://www.scb.se/en_/About-us/Open-data-API/API-for-the-Statistical-Database-/

like image 707
Celebrian Avatar asked Oct 10 '16 08:10

Celebrian


People also ask

How do you send a POST request in Python?

Python Requests POST method syntax Where: URL: target URL/API point. data (optional): the data to send to the server, can be a dictionary, a list of tuples, bytes, or a file. json (optional): a dictionary that will be converted to a JSON string and included in the body of the POST request.

Does Postman work with Python?

As an example, you can use Postman to generate Python code for the call that shuffles six decks, then have the Python code use that generated deck_id to draw two cards from the deck.


1 Answers

Set json=payload and requests will add the headers you need:

url = 'http://api.scb.se/OV0104/v1/doris/en/ssd/BE/BE0101/BE0101A/BefolkningNy'
payload = ....


r = requests.post(url, json=payload)

That will give you your json:

In [7]: 
   ...: r = requests.post(url, json=payload)
   ...: print(r.json())
   ...: 
{u'data': [{u'values': [u'2054343'], u'key': [u'01', u'2010']}, {u'values': [u'2091473'], u'key': [u'01', u'2011']}], u'comments': [], u'columns': [{u'text': u'region', u'code': u'Region', u'type': u'd'}, {u'text': u'year', u'code': u'Tid', u'type': u't'}, {u'text': u'Population', u'code': u'BE0101N1', u'type': u'c'}]}

If you happen to get an json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): error set the encoding to utf-8-sig:

r = requests.post(url, json=payload)
r.encoding = "utf-8-sig"
print(r.json())
like image 129
Padraic Cunningham Avatar answered Sep 21 '22 08:09

Padraic Cunningham