What is the difference between the `data` and `json` named arguments with requests.post?

Question:

According to the relevant portion of the requests library documentation, the primary method to pass a dictionary to the post method is as follows:

r = requests.post(url, data = {"example": "request"})

Afterwards, the authors demonstrate an example of passing a JSON string directly to the Github API. Then the authors suggest that instead of encoding the dictionary as a JSON string and passing it via data, you can simply use the named parameter json to pass a dictionary in as follows.

r= requests.post(url, json = {"example": "request"})

When would you use json instead of data? Is this redundancy idiosyncratic or intentional?

Asked By: W4t3randWind

||

Answers:

Passing a dict to data causes the dict to be form-encoded, as though you were submitting a form on an HTML page; e.g., data={"example": "request"} will be sent in the request body as example=request. The json keyword, on the other hand, encodes its argument as a JSON value instead (and also sets the Content-Type header to application/json).

Answered By: jwodder

From the requests documentation, it seems that data was meant to be used for form submission, hence it is built to expect dict datatype and will process objects passed to this variable into a dict type if it can.

For example, if a nested json is passed to data:

{
      "ticker_symbol":ticker,
      "model_type":"2",
      "prediction":[
        {
          "epoch_time": 11111100000,
          "price": 12.00,
          "confidence_score": 0.6,
          "rate_of_error": 0.015,
        },
        {
          "epoch_time": 12112230000,
          "price": 13.00,
          "confidence_score": 0.7,
          "rate_of_error": 0.015,
        }
      ]
}

It will be "flattened" to become:

{
      "ticker_symbol":ticker,
      "model_type":"2",
      "prediction":[
          "epoch_time": 11111100000,
          "price": 12.00,
          "confidence_score": 0.6,
          "rate_of_error": 0.015,
          "epoch_time": 12112230000,
          "price": 13.00,
          "confidence_score": 0.7,
          "rate_of_error": 0.015,
      ]
}

Essentially although prediction is formatted as a json object with nested data, it will be transformed by requests.post() to become a key:[value] pair.

Answered By: Kian Guan
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.