异常“当使用request()

时间:2017-01-06 07:04:38

标签: python json post parameters python-requests

我计划使用以下代码向服务器发送请求。我花了一天多的时间来解决这个问题,但没有任何进展。请原谅我,我必须隐藏公司安全政策的真实URL地址。

import requests

get_ci = requests.session()

get_ci_url = 'https://this_is_a_fake_URL_to_paste_in_stackoverflow.JSON'
get_ci_param_dict = {"Username": "fake","Password": "fakefakefake","CIType": "system","CIID": "sampleid","CIName": "","AttrFilter": "","SubObjFilter": ""}
get_ci_param_str = str(get_ci_param_dict)

print(get_ci_param_dict)
print(get_ci_param_str)

get_ci_result = get_ci.request('POST', url=get_ci_url, params=get_ci_param_str, verify=False)

print(get_ci_result.status_code)
print(get_ci_result.text)

我在Run结果中得到的是,

C:\Python34\python.exe C:/Users/this/is/the/fake/path/Test_02.py
{'CIID': 'sampleid', 'CIType': 'system', 'AttrFilter': '', 'Password': 'fake', 'CIName': '', 'Username': 'fake', 'SubObjFilter': ''}
{'CIID': 'sampleid', 'CIType': 'system', 'AttrFilter': '', 'Password': 'fake', 'CIName': '', 'Username': 'fake', 'SubObjFilter': ''}
C:\Python34\lib\requests\packages\urllib3\connectionpool.py:843: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
500
<ns1:XMLFault xmlns:ns1="http://cxf.apache.org/bindings/xformat"><ns1:faultstring xmlns:ns1="http://cxf.apache.org/bindings/xformat">*org.codehaus.jettison.json.JSONException: A JSONObject text must begin with '{' at character 0 of* </ns1:faultstring></ns1:XMLFault>

Process finished with exit code 0

更多提示,

  1. 我已联系服务器代码开发人员 - 他们只需要一个 以“参数”方式发送的JSON格式的字符串。这意味着它 在params中使用request()是正确的。

  2. 我试过dumps.json(get_ci_param_dict) =&gt;同样的结果。

  3. 当我只请求服务器的root时,它返回了200个代码,     这证明我的网址没问题。

  4. params更新为data时的其他日志。

    C:\Python34\lib\requests\packages\urllib3\connectionpool.py:843: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
      InsecureRequestWarning)
    500
    <html><head><title>Apache Tomcat/7.0.61 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - 1</h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u>1</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>java.lang.ArrayIndexOutOfBoundsException: 1
        com.fake.security.XSSHttpReuquestWrapper.GeneralParameters(XSSHttpReuquestWrapper.java:158)
        com.fake.security.XSSHttpReuquestWrapper.checkParameter(XSSHttpReuquestWrapper.java:101)
        com.fake.security.XSSHttpReuquestWrapper.validateParameter(XSSHttpReuquestWrapper.java:142)
        com.fake.security.XSSSecurityFilter.doFilter(XSSSecurityFilter.java:35)
        com.fake.webservice.interceptor.GetContextFilter.doFilter(GetContextFilter.java:24)
        org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
        org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    </pre></p><p><b>note</b> <u>The full stack trace of the root cause is available in the Apache Tomcat/7.0.61 logs.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.61</h3></body></html>
    
    Process finished with exit code 0
    

    本问题的最终解决方案

    @ e4c5您的建议有助于找出最终解决方案。 param应该通过data发送到服务器,因为data应该作为官方文档中定义的字典或字节发送,因此需要使用param作为dict键发送。请参阅以下代码,

    import requests
    import json
    
    
    get_ci_url = 'https://sample.fake.com:0000/sample/fake/fakeagain.JSON'
    get_ci_param_dict = {"Username": "fake","Password": "fakefake".......}
    get_ci_param_json = json.dumps(get_ci_param_dict)
    
    params = {'param': get_ci_param_json}
    
    get_ci_result = requests.request('POST', url=get_ci_url, data=params, verify=False)
    
    print(get_ci_result.status_code)
    print(get_ci_result.text)
    

    ROOT CAUSE:param应通过data参数发送。正式文件明确指出=&gt; :param data :(可选)要在:class Request的正文中发送的字典,字节或类文件对象。

    谢谢我的同事--J先生和@ e4c5的大力帮助。

3 个答案:

答案 0 :(得分:3)

如果服务器期望的是json,则应该将json参数用于python请求

get_ci_result = get_ci.request('POST', url=get_ci_url,  
    json=get_ci_param_dict, verify=False)

还要注意params参数通常与get一起使用(用于格式化URL的查询字符串),post和form数据应该是data和字典。

有关其他信息,请参阅:http://docs.python-requests.org/en/master/api/

答案 1 :(得分:1)

发出请求时,您的数据字典将自动为form-encoded。服务器接受JSON编码的POST / PATCH数据而不是json数据时,请使用form-encoded参数。

response = requests.post(url=url, headers=headers, json=data)

在请求中使用json参数会将标头中的Content-Type更改为application / json。

访问https://2.python-requests.org/en/master/user/quickstart/#More-complicated-POST-requests

答案 2 :(得分:0)

我也有类似的问题。

即使我的数据已经是字典,我仍然需要再次json.dumps(data):

response = requests.post(url = url ,headers=head,data = json.dumps(data))


我只是想分享一下,以防有人遇到类似的问题。