最近在做requests請求時遇到如下報錯:
{"code":"500","message":"JSON parse error: Cannot construct instance of `com.bang.erpapplication.domain.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"name\":\"aa12345\", \"pwd\":\"lemon666\", \"age\":18, \"email\":\"121313927@qq.com\", \"phone\": \"15086666888\"}'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.bang.erpapplication.domain.User` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"name\":\"aa12345\", \"pwd\":\"lemon666\", \"age\":18, \"email\":\"121313927@qq.com\", \"phone\": \"15086666888\"}')\n at [Source: (PushbackInputStream); line: 1, column: 1]"}
調查了半天,發現是requests調用post方法時,data參數和json參數沒搞明白。下面做一下梳理。
接口需求是: 請求格式為application/json。之前測試的接口用的是application/x-www-form-urlencoded格式,使用data傳字典,得到響應結果
這次使用json數據傳參,可以使用json和data兩種方式
json和dict
python中並沒有json類型這一說法,使用json.dumps(dict)將dict轉換成json格式,得到字符串對象
雖說json格式的數據在python中以字符串類型存在,但是通過str(dict)得到的結果和json.dumps(dict)得到的結果是不相同的
可以看出來json格式的數據,除了要滿足字典類型的格式外,字符串對象必須要雙引號
requests的post請求
如果請求的數據格式為json,有2種方式:
1). 字典格式定義數據,使用json.dumps(dict)轉換成json數據,使用data參數進行報文提交
2). 直接使用json參數傳字典進行報文提交
如果使用json=json.dumps(data)就會報最開始的錯誤
可以在headers定義{"Content-Type": "application/json"}並傳輸,實測不傳也沒什么問題
其他
在requests.get()方法中可以使用params參數傳遞數據,有時候請求結果會呈現亂碼的狀態,可以通過res的encoding屬性查看編碼方式。
在獲取res.text之前對res.encoding='utf-8'賦值,這樣就可以解決請求結果亂碼的問題