首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用urllib2请求与build_opener发布JSON之间的意外行为(Python2.7)

使用urllib2请求与build_opener发布JSON之间的意外行为(Python2.7)
EN

Stack Overflow用户
提问于 2017-02-24 11:40:19
回答 1查看 166关注 0票数 0

编辑:

找到了解决办法。因为RBC端点是https,所以处理程序类也需要有一个https_request函数,而不仅仅是一个http_request。

Solution for http endpoints

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ChangeTypeProcessor(urllib2.BaseHandler):
    def http_request(self, req):
        req.unredirected_hdrs["Content-type"] = "application/json"
        req.unredirected_hdrs["User-Agent"] = "Python-urllib/2.7"
        return req

    def https_request(self, req):
        req.unredirected_hdrs["Content-type"] = "application/json"
        req.unredirected_hdrs["User-Agent"] = "Python-urllib/2.7"
        return req

在使用python中使用urllib2库发布JSON数据的两种不同方法时,我遇到了奇怪的行为差异。尽管我知道请求是存在的,但我正在使用遗留软件,这使得切换变得更加困难。遗留软件还使用了发布数据的build_opener方法。

在尝试将JSON发布到RBC的求职时,request对象能够成功地获得JSON数据/响应。然而,当将JSON发布到RBC的作业库时,OpenerDirector并不能成功地获得响应。

以下是我试图从RBC获取工作数据的测试器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import json
import urllib2
import urlparse

class ChangeTypeProcessor(urllib2.BaseHandler):
    def http_request(self, req):
        req.unredirected_hdrs["Content-type"] = "application/json"
        req.unredirected_hdrs["User-Agent"] = "Python-urllib/2.7"
        return req

data = '{"lang":"en_ca","deviceType":"desktop","country":"ca","ddoKey":"refineSearch","sortBy":"","subsearch":"","from":100,"all_fields":[],"pageName":"search-results","counts":true,"jobs":true,"keywords":"","global":true,"size":50,"sele
cted_fields":null,"sort":null}'
url = "https://jobs.rbc.com/widgets"
#url = "http://httpbin.org/post"
request = urllib2.Request(url)
request.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(request, data)

urlopener = urllib2.build_opener()
urlopener.add_handler(ChangeTypeProcessor())
print(response.read())

connection = urlopener.open(url, data)
print(connection.read())

以下是OpenDirector在发布到站点时产生的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Traceback (most recent call last):
  File "jsonPost.py", line 23, in <module>
    connection = urlopener.open(url, data)
  File "/usr/local/lib/python2.7/urllib2.py", line 437, in open
    response = meth(req, response)
  File "/usr/local/lib/python2.7/urllib2.py", line 550, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python2.7/urllib2.py", line 475, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python2.7/urllib2.py", line 409, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python2.7/urllib2.py", line 558, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: Internal Server Error

以下是用http://httpbin.org/post发布的数据:

请求对象的响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "args": {},
  "data": "{\"lang\":\"en_ca\",\"deviceType\":\"desktop\",\"country\":\"ca\",\"ddoKey\":\"refineSearch\",\"sortBy\":\"\",\"subsearch\":\"\",\"from\":100,\"all_fields\":[],\"pageName\":\"search-results\",\"counts\":true,\"jobs\":true,\"keywords\":\"\",\"global\":true,\"size\":50,\"selected_fields\":null,\"sort\":null}",
  "files": {},
  "form": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Content-Length": "259",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/2.7"
  },
  "json": {
    "all_fields": [],
    "country": "ca",
    "counts": true,
    "ddoKey": "refineSearch",
    "deviceType": "desktop",
    "from": 100,
    "global": true,
    "jobs": true,
    "keywords": "",
    "lang": "en_ca",
    "pageName": "search-results",
    "selected_fields": null,
    "size": 50,
    "sort": null,
    "sortBy": "",
    "subsearch": ""
  },
  "origin": "<hidden>",
  "url": "http://httpbin.org/post"
}

OpenDirector的响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "args": {},
  "data": "{\"lang\":\"en_ca\",\"deviceType\":\"desktop\",\"country\":\"ca\",\"ddoKey\":\"refineSearch\",\"sortBy\":\"\",\"subsearch\":\"\",\"from\":100,\"all_fields\":[],\"pageName\":\"search-results\",\"counts\":true,\"jobs\":true,\"keywords\":\"\",\"global\":true,\"size\":50,\"selected_fields\":null,\"sort\":null}",
  "files": {},
  "form": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Content-Length": "259",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/2.7"
  },
  "json": {
    "all_fields": [],
    "country": "ca",
    "counts": true,
    "ddoKey": "refineSearch",
    "deviceType": "desktop",
    "from": 100,
    "global": true,
    "jobs": true,
    "keywords": "",
    "lang": "en_ca",
    "pageName": "search-results",
    "selected_fields": null,
    "size": 50,
    "sort": null,
    "sortBy": "",
    "subsearch": ""
  },
  "origin": "<hidden>",
  "url": "http://httpbin.org/post"
}

值得注意的是,httpbin提供的信息表明所发布的数据完全相同,但由于某种原因,OpenDirector无法获得适当的响应。

我想要的解决方案是使OpenDirector成功地获得适当的响应,而不需要重新实现使用请求或请求对象的代码库。

有没有人知道是什么原因造成了这种差异?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 13:16:50

找到了解决办法。因为RBC端点是https,所以处理程序类也需要有一个https_request函数,而不仅仅是一个http_request。

Solution for http endpoints

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ChangeTypeProcessor(urllib2.BaseHandler):
    def http_request(self, req):
        req.unredirected_hdrs["Content-type"] = "application/json"
        req.unredirected_hdrs["User-Agent"] = "Python-urllib/2.7"
        return req

    def https_request(self, req):
        req.unredirected_hdrs["Content-type"] = "application/json"
        req.unredirected_hdrs["User-Agent"] = "Python-urllib/2.7"
        return req
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42446985

复制
相关文章
linux 查看目录的剩余空间大小
df -h 查看整台服务器的硬盘使用情况
yaohong
2019/09/11
14.4K0
linux 查看目录的剩余空间大小
圆圈中最后剩余的数字
0,1,2,3 ,. . . ,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求这个圆圈里剩余的最后一个数字。
大学里的混子
2018/10/30
1.3K0
Sqlserver查询数据库文件大小和剩余空间
在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率:
跟着阿笨一起玩NET
2019/08/29
5.4K0
Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
拓展表空间方法,可以看到表空间文件 NCC_DATA01_1-23 共同组成了表空间 NCC_DATA01,所以我们直接在存储表空间路径的基础上再加上一个新的序列号表空间文件就好了。 下面设置的是默认 500M 大小,以后剩余控件不足时,每次自动增加 200M。
小蓝枣
2020/09/24
3.1K0
Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
mysql查询表占用空间大小_oracle查看表空间大小
在mysql中有一个默认的数据表information_schema,information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面,所以请勿删改此表。
全栈程序员站长
2022/10/03
5.3K0
【树莓派】centos系统扩展tf剩余空间
扩展空间 包含centos7系列的系统,不要信某N的使用fdisk工具! 只需要: /usr/bin/rootfs-expand 即可! 千万不要信某N的! 附:连接wifi 1. 查看周围wifi nmcli d wifi 2. 连接wifi wifi名:wifi_name wifi密码:wifi_pwd nmcli d wifi connect wifi_name password 'wifi_pwd' 3. wifi连接历史 UUID号 nmcli c 4. 删除wifi nmcl
一朵灼灼华
2022/08/05
7110
C盘的剩余空间对开机速度有影响吗?
C盘作为系统盘,如果剩余 空间不足肯定会影响到开机的速度。所以一般在装机的时候C盘的空间预留的稍微大一些,就是为了腾出足够多的剩余空间,这样安装的文件不至于占满整个C盘空间。
程序员互动联盟
2020/05/14
3.9K0
C盘的剩余空间对开机速度有影响吗?
玩玩树莓派之扩展SD卡剩余空间
前言:在安装好Go环境之后万事俱备只欠东风的情况下,我充满了喜悦,正准备go get -u github.com/gogits/gogs,然而fatal: write error: No space
AlicFeng
2018/06/08
1.8K0
WGCLOUD进阶使用 - 如何监测oracle表空间大小
我们最近在项目中部署了WGCLOUD平台,它可以监测主机、服务器、进程应用、端口、日志、docker、数据库、服务接口、PING、SNMP等等
那年十八
2022/09/19
1.7K0
WGCLOUD进阶使用 - 如何监测oracle表空间大小
Docker修改空间大小 原
首先,修改空间大小,必需使Docker运行在daemon环境下,即先停止正在运行的docker服务:
拓荒者
2019/03/11
3.7K0
Docker修改空间大小
                                                                            原
球体投影到像素空间的大小
需要说明的是,球体投影到像素空间的结果可能不是一个正圆,其半径或者直径大小只能估算而没有确定的值。根据参考资料,球体投影到像素空间的半径的计算公式为:
charlee44
2022/09/28
2.3K0
球体投影到像素空间的大小
mssql 获取表空间大小
create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_size varchar(100),unused varchar(100)) declare @name varchar(100) declare cur cursor for select name from sysobjects where xtype='u' order by name
阿新
2018/04/09
1.9K0
精确统计所有库表的大小
统计每个库每个表的大小是数据治理工作的最基本内容,本文将从抽样统计结果及精确统计结果两方面来统计MySQL的每个库每个表的数据量情况。
俊才
2020/07/01
1.4K0
精确统计所有库表的大小
剔除 HIVE中select除了某些字段之外的剩余所有字段
只需要设置参数 set hive.support.quoted.identifiers=None; 指定要剔除哪个字段 select (剔除的字段)?+.+ from table 示例: 选择
chimchim
2022/11/13
1.9K0
CentOS查看磁盘空间大小
查看磁盘空间大小 df -h 查看当前文件夹所有文件大小 du -sh 查看指定文件夹大小 du -h /data 查看指定文件夹下所有文件的大小 du -h /data/ 查看指定文件大小 du -h data.log 查看目录挂载点 df /data 加上-kh以g单位显示 df /data -kh
Lansonli
2021/10/09
2.9K0
centos查看文件占用空间大小
du -sh * | sort -n : 统计当前文件夹(目录)大小,并按文件大小排序
似水的流年
2021/10/12
4.1K0
centos查看文件占用空间大小
du -sh * | sort -n : 统计当前文件夹(目录)大小,并按文件大小排序
Qicloud
2022/01/27
4.5K0
div 自适应高度 自动填充剩余高度
方案1: Html: <div class="outer"> <div class="A"> 头部DIV </div> <div class="B">下部DIV </div> </div> CSS: html, body { height: 100%; padding: 0; margin: 0; } .outer { height: 100%; padding: 100px 0 0; box-sizing: border-box ; position: re
庞小明
2018/03/07
5.2K0
div 自适应高度 自动填充剩余高度
案例:AWR手工创建快照失败,SYSAUX表空间剩余不足处理
版本:Oracle 11.2.0.4 RAC 问题现象:AWR手工创建快照失败,SYSAUX表空间剩余不足。
Alfred Zhao
2019/05/24
1.2K0
EX-函数应用:提取一列中最后单元格的数据
针对在Excel中提取一列中最后单元格的数据问题,根据不同情况,可以用来很多方法来解决。
大海Power
2021/08/30
5.5K0

相似问题

jqGrid高级搜索对话框-具有下拉选择的列

10

JQGRID搜索调整大小

10

jqGrid内联多搜索选择下拉列表

11

jqGrid:更新高级搜索对话框,列下拉列表-使用列选择器添加列之后

11

jqgrid动态更改搜索模式中的“下拉列选择”

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文