Once upon a time
I, once was stuck when using python-requests in order to poke a PHP backend.
You may currently face this issue as Requests does not support dict with depth greater than 1 on parameter data for a x-www-form-urlencoded based request.
PHP/jQuery $.params support this syntax out of the box. As requests is not about supporting the way PHP/jQuery $.params work internally, this PR maybe doomed.
To reproduce
from requests import post
from pprint import pprint
if __name__ == '__main__':
response = post(
'https://api.ipify.org?format=json',
{
'auth_user': 'test',
'auth_pwd': 'test',
'json_data': {
'operation': 'core/get',
'class': 'ServiceChange',
'key': 'SELECT ServiceChange WHERE id=429',
'output_fields': 'request_state',
'h': {
't': 1
}
}
}
)
pprint(
response.request.body
)
What happen now
print(response.request.body)
# auth_user=test&auth_pwd=test&json_data=operation&json_data=class&json_data=key&json_data=output_fields&json_data=h
Something should happen when passing nested dict. This behavior is wrong. We loss data between passing and sending. At least raise a warning or whatnot.
✨ What should have happened
print(response.request.body)
# auth_user=test&auth_pwd=test&json_data%5Boperation%5D=core%2Fget&json_data%5Bclass%5D=ServiceChange&json_data%5Bkey%5D=SELECT+ServiceChange+WHERE+id%3D429&json_data%5Boutput_fields%5D=request_state&json_data%5Bh%5D%5Bt%5D=1
Why ?
- [x]
requests
is on a higher level than urllib, this does not make sense inurllib
, but can inrequests
- [x] PHP and Ruby on Rails support this syntax out of the box, and is used by more than 30 % of the remote backends.
- [x] This PR would make it more beginner friendly, advanced users that are looking for
test=foo&test=baz
are more likely to encode their payload manually. Not the other way around. - [x] This change does not break or change actual behavior expect for the multivalued param case which is a very rare case in my opinion.
How to use this patch ?
Simply use my fork for the time being, you could support my PR too.
Patch : tree/patch-1
PR : https://github.com/psf/requests/pull/5253
Top comments (1)
thanks for your contribution, you saved me time struggling where the issue is :)
Just adding those line for anyone else who's facing the same problem.
or update requests by the url in your requirements.txt.