You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Requests发送null元素调用API?

问题:DocuWare API POST请求中session设为null时出现反序列化错误

我需要向DocuWare的API发送POST请求,要求session参数设为null。浏览器发送的有效载荷为:

{"session":null,"query":{"__type":"SelectListQuery:http://dev.docuware.com/settings/organization"}}

我用Python Requests编写了如下代码:

def get_all_fixed_lists_guid(self, s):
    headers = {'Authorization': self.token}
    url = f'{self.url}/DocuWare/Settings/SettingsService.svc/jwt/GetSelectLists'
    payload = {"session": json.dumps(None), "query": {
        "__type": "SelectListQuery:http://dev.docuware.com/settings/organization"}}
    response = s.request('POST', url, json=payload, timeout=30)
    print(response.content)
    return response.status_code == 200

URL和token均正确。我尝试过以下几种设置session的方式:

  • None
  • json.dumps(None)
  • "null"
  • False
  • json.dumps(False)

除不传递session参数的情况外,其他方式都会收到服务器返回的400错误,错误信息如下:

b'{"ExceptionType":"System.ServiceModel.Dispatcher.NetDispatcherFaultException",
"FaultCode":"Sender","Message":"The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http:\/\/dev.docuware.com\/services\/settings:session. 
The InnerException message was \'Expecting state \'Element\'.. Encountered \'Text\'  with name \'\', namespace \'\'. \'.  Please see InnerException for more details.",
"StackTrace":" at System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part) at System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, PartInfo returnInfo, Object& returnValue) at System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeBodyCore(XmlDictionaryReader reader, Object[] parameters, Boolean isRequest) at System.ServiceModel.Dispatcher.DataContractJsonSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest) at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest) at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)"}'

我期望获得200状态码及对应JSON响应,而非400错误。


解决方案

这个错误源于DocuWare使用的DataContractJsonSerializer(WCF序列化器)对JSON的处理逻辑和标准JSON存在差异,尤其是null值的序列化规则。尝试以下两种解决方法:

方法1:直接用None,依赖Requests自动序列化

当使用Requests的json=payload参数时,框架会自动将Python的None序列化为JSON原生的null,无需手动调用json.dumps处理。之前的错误是因为手动序列化导致session被转为字符串"null",而非原生null。

修改代码如下:

def get_all_fixed_lists_guid(self, s):
    headers = {'Authorization': self.token}
    url = f'{self.url}/DocuWare/Settings/SettingsService.svc/jwt/GetSelectLists'
    # 直接传入None,让Requests自动转为JSON null
    payload = {"session": None, "query": {
        "__type": "SelectListQuery:http://dev.docuware.com/settings/organization"}}
    response = s.request('POST', url, json=payload, timeout=30)
    print(response.content)
    return response.status_code == 200

方法2:手动构造JSON字符串,用data参数发送

如果方法1仍不生效,可手动构造与浏览器完全一致的JSON字符串,通过data参数发送,并显式设置Content-Type头:

import json

def get_all_fixed_lists_guid(self, s):
    headers = {
        'Authorization': self.token,
        'Content-Type': 'application/json'
    }
    url = f'{self.url}/DocuWare/Settings/SettingsService.svc/jwt/GetSelectLists'
    # 手动构造匹配浏览器的JSON字符串
    payload_str = '{"session":null,"query":{"__type":"SelectListQuery:http://dev.docuware.com/settings/organization"}}'
    response = s.request('POST', url, data=payload_str, headers=headers, timeout=30)
    print(response.content)
    return response.status_code == 200

失败原因说明

  • json.dumps(None)和"null"会将session转为字符串类型的"null",而非JSON原生null,WCF序列化器无法识别。
  • False会被序列化为false,与API要求的null类型不匹配。

内容的提问来源于stack exchange,提问作者Le_Tasse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:10:29