使用Python Requests库发送POST请求时出现INVALID_REQUEST错误的排查与解决咨询
Hey,我看了你遇到的问题,刚上手requests库的时候确实容易踩这类坑,咱们一步步来排查和解决:
首先,JSON数据的发送方式错了:你设置的
Content-Type是application/json,但代码里用了data=data参数,requests默认会把data里的字典以表单格式(application/x-www-form-urlencoded)发送,这和服务器期望的JSON格式不匹配,这大概率是导致INVALID_REQUEST的核心原因。你应该把data替换成json参数,或者手动把字典转成JSON字符串再用data发送(但前者更简单)。不要手动指定
Content-Length:requests会自动根据你发送的内容计算并设置这个请求头,你手动写的166如果和实际发送的JSON内容长度不一致,服务器会因为请求体长度不匹配拒绝请求,直接删掉这个头就行。检查URL参数的完整性和正确性:你的URL里有一堆长参数(比如
signup_session_id、rh_session_id),这些参数都是会话相关的,要确保和BurpSuite里抓到的原始请求完全一致,哪怕少一个字符或者打错一个字母,都可能导致请求无效。验证Authorization头的准确性:你用的Basic Auth字符串要和Burp里的完全一致,检查有没有复制时遗漏或多打了字符,这个头是身份验证的关键,出错的话服务器也会返回无效请求。
对比原始请求和代码发送的请求:可以开启requests的调试模式,或者用抓包工具(比如再次用Burp)捕获代码发送的请求,和你从Burp拿到的原始请求逐行对比,看头信息、请求体格式、URL参数有没有差异,这是排查这类问题最有效的方法。
下面是修改后的示例代码,你可以试试:
import requests CreateAndStartHeaders = { "Host": "germany-rental.taxify.eu", "Accept": "*/*", "Content-Type": "application/json", "Accept-Encoding": "gzip, deflate", "Authorization": "Basic KzQ5MTc2NzA4Njc1MDQ6MUZCRjAwMEYtQkQzRC00RjgwLUE5NUItRUZFODg4RjYzQzVB", "User-Agent": "Bolt/109764413 CFNetwork/1390 Darwin/22.0.0", "Accept-Language": "en-GB,en;q=0.9", "Cache-Control": "no-cache" } data = { "vehicle_handle" : { "value" : "333-333", "type" : "uuid" }, "source" : "single_order", "payment_instrument_id" : "adyen_paypal\/6216325090316059" } url = "https://germany-rental.taxify.eu/micromobility/user/ui/order/createAndStart?gps_age=0.4934508800506592&signup_session_id=e17333a3083993252554877ff58328094ffc3e225168026c4ed412a6518e8f47&country=de&lat=50.09257534411632&user_id=90791700&gps_lat=50.09243612776929&version=CI.91.0&device_name=iPhone12,8&gps_lng=8.225763438023886&lng=8.225648382329815&deviceType=iphone&distinct_id=client-90791700&rh_session_id=90791700u1684582741&language=en-GB&gps_accuracy_m=9.485426861614163&deviceId=ABD8E483-E0A1-496F-826E-6E96A2677BA8&device_os_version=iOS16.0&session_id=90791700u1684583212" # 这里把data改成json参数,让requests自动以JSON格式发送 r = requests.post(url, headers=CreateAndStartHeaders, json=data) print(r.content)
如果还是不行,建议你把代码发送的请求和Burp里的原始请求做对比,重点看请求体的格式、请求头的差异,应该就能找到问题所在啦。
备注:内容来源于stack exchange,提问作者abdonis

