当前位置: 首页 > 知识库问答 >
问题:

python请求POST基本身份验证返回200,正文为空

樊胜
2023-03-14
import requests
s = requests.Session()
r = requests.Request('POST', 'https://'+url+'?name=value')
prep = r.prepare()
prep.headers = {'User-Agent': 'curl/7.38.0', 'Accept': '*/*', 'Authorization': 'Basic <load of hex>==', 'Content-Type': 'application/json'}
response = s.send(prep)

输出:

DEBUG:requests.packages.urllib3.connectionpool:"POST /url?name=value HTTP/1.1" 200 None

为什么我得到200指示身份验证成功,但没有json返回给我必要的凭据?(如果我篡改授权标头,它会按预期返回403)。

我直接从一个成功的curl请求到同一个服务获取了请求头。为什么请求不返回任何内容?

成功的卷曲日志:

$ curl -v https://url?name=value -X POST -H "Content-Type: application/json" -u <user:secret>
* Hostname was NOT found in DNS cache
*   Trying <ip>...
* Connected to url port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
*        <cert detail>
*        SSL certificate verify ok.
* Server auth using Basic with user '<user>'
> POST url?name=value HTTP/1.1
> Authorization: Basic <hex encoded string>==
> User-Agent: curl/7.38.0
> Host: <host>
> Accept: */*
> Content-Type: application/json
>
< HTTP/1.1 200 OK
* Server openresty/1.7.4.1 is not blacklisted
< Server: openresty/1.7.4.1
< Date: Tue, 08 Mar 2016 15:47:08 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Correlation-Id: <id>
< Strict-Transport-Security: max-age=31536000
< Cache-Control: private, no-cache, no-store, no-transform, max-age=0
< X-XSS-Protection: 1; mode=block
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Content-Type-Options: nosniff
< X-Frame-Options: deny
<
{"access_token": "<hex value>", "token_type": "bearer", "expires_in": "3599", "scope": "<bunch of authorisations>", "jti": "<string>"}
* Connection #0 to host <host> left intact

共有2个答案

齐运诚
2023-03-14

我会以不同的方式使用请求。我会这样做:

from requests import Session

s = Session()

url = 'abc.com'

headers = {'User-Agent': 'blah', 'Authorization': 'Basic <hex>==', 'Accept': '*/*', 'Content-Type': 'application/json'}

# Add headers
s.headers.update(headers)

res = s.post(url)

data = res.json()

您可以将data={'key':'value'}作为post加载传递,但我只能猜测,在不知道url的情况下。

杨选
2023-03-14

当我使用请求时,服务器返回一个空响应(即使身份验证成功,http代码为200)。

我不确定如何使用请求避免这种情况,因此我在普通的旧urllib中执行了以下操作:

import urliblib.request
headers = {'User-Agent': 'blah', 'Authorization': 'Basic <hex>==', 'Accept': '*/*', 'Content-Type': 'application/json'}
req = urllib.request.Request(url, headers=headers, method='POST')
print(urllib.request.urlopen(req).readlines())

现在,响应返回正确的数据。我假设服务器存在一些缓存问题,就像现在一样,当我使用通过urllib添加的所有额外头请求时,我会得到类似的成功响应。

 类似资料:
  • 问题内容: 我必须 使用 HTTP Basic身份验证从http服务器下载和解析XML文件。现在,我这样做: 但是以这种方式,我无法从具有http身份验证的服务器获取xml(或者我只是根本不知道该文档)文档。 如果您能向我展示实现我的目标的最好,最简单的方法,我将不胜感激。 问题答案: 您可以使用。例如: 这将设置默认值,并将在 所有 请求中使用。显然,当您不需要所有请求的凭据或多个不同的凭据(可

  • 我试图得到一个API查询到python。命令行 给出一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python中调用它,这样我就可以循环使用不同的ID并分析输出。有什么想法吗?在需要身份验证之前,我已经使用urllib2完成了这项工作。我还查看了requests模块,但不知道如何实现。 非常感谢。

  • 问题内容: 我正在尝试在python中使用基本身份验证 响应表单 auth 变量: 但是,当我尝试从其他位置获取数据时-我收到401错误 据我了解-在第二个请求中不是替换的会话参数。 问题答案: 您需要使用会话对象,并向 每个请求 发送身份验证。该会话还将为您跟踪Cookie:

  • 我得到了一个使用fcm发送通知的应用程序,当我通过控制台发送消息时一切正常,但是当我尝试通过php(curl-post)或postman(firefox扩展)发送消息时,我得到了一个身份验证错误(甚至使用了密钥) 字符串(304)“{”错误:{”代码:401,“消息”:“请求缺少所需的身份验证凭据。应为OAuth 2访问令牌、登录cookie或其他有效身份验证凭据。请参阅https://devel

  • 问题内容: 从HttpClient 4.3开始,我一直在使用HttpClientBuilder。我正在连接到具有基本身份验证的REST服务。我将凭据设置如下: 但是,这不起作用(我正在使用的REST服务返回401)。怎么了? 问题答案: 从此处的 抢先身份验证 文档中: http://hc.apache.org/httpcomponents-client- ga/tutorial/html/aut

  • 问题内容: 我正在尝试将API查询输入python。命令行 提供一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python进行此调用,以便我可以遍历不同的id并分析输出。有任何想法吗?在需要身份验证之前,我已经使用urllib2进行了此操作。我也查看了请求模块,但无法弄清楚该怎么做。 非常感谢。 问题答案: 该请求包有一个用于HTTP请求的一个非常好的API,加入了自定义