Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用urllib2请求与使用已发布JSON(Python 2.7)的build_opener之间的意外行为_Python_Json_Python 2.7 - Fatal编程技术网

使用urllib2请求与使用已发布JSON(Python 2.7)的build_opener之间的意外行为

使用urllib2请求与使用已发布JSON(Python 2.7)的build_opener之间的意外行为,python,json,python-2.7,Python,Json,Python 2.7,编辑: 找到了解决办法。由于RBC端点是https,处理程序类也需要有https\u请求函数,而不仅仅是http\u请求 类ChangeTypeProcessorurllib2.BaseHandler: def http_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求 def https_requestself,请求: req.unre

编辑:


找到了解决办法。由于RBC端点是https,处理程序类也需要有https\u请求函数,而不仅仅是http\u请求

类ChangeTypeProcessorurllib2.BaseHandler: def http_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求 def https_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求 在python中使用urllib2库发布JSON数据的两种不同方法时,我遇到了奇怪的行为差异。虽然我知道存在请求,但我正在使用遗留软件,这使得切换变得更加困难。遗留软件还使用build_opener方法发布数据

在尝试将JSON发布到RBC的job search时,请求对象能够成功获取JSON数据/响应。然而,在向RBC的工作库发布JSON时,OpenerDirectory无法成功获得响应

以下是我用来尝试从RBC获取工作数据的测试仪:

导入json 导入urllib2 导入URL解析 类ChangeTypeProcessorurllib2.BaseHandler: def http_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求 数据={lang:en_ca,设备类型:桌面,国家/地区:ca,ddoKey:refineSearch,sortBy:,subsearch:,from:100,所有字段:[],pageName:搜索结果,计数:true,作业:true,关键字:,全局:true,大小:50,选择 cted_字段:null,排序:null}' url=https://jobs.rbc.com/widgets url=http://httpbin.org/post request=urlib2.Requesturl 请求。添加标题“Content-Type”、“application/json” response=urlib2.urlopenrequest,数据 urlopener=urlib2.build\u opener urlopener.add_handlerChangeTypeProcessor printresponse.read 连接=urlopener.openurl,数据 printconnection.read 以下是OpenDirector在发布到站点时产生的错误:

回溯最近一次呼叫上次: 文件jsonPost.py,第23行,在 连接=urlopener.openurl,数据 文件/usr/local/lib/python2.7/urllib2.py,第437行,打开 response=methreq,response http_响应中的/usr/local/lib/python2.7/urllib2.py文件,第550行 “http”、请求、响应、代码、消息、hdrs 文件/usr/local/lib/python2.7/urllib2.py,第475行出错 返回self.\u调用\u链*参数 文件/usr/local/lib/python2.7/urllib2.py,第409行,在调用链中 结果=函数*参数 文件/usr/local/lib/python2.7/urllib2.py,第558行,默认为http\u error\u 提升HTTPErrorreq.get_full_url、代码、消息、hdrs、fp urllib2.HTTPError:HTTP错误500:内部服务器错误 以下是通过以下方式获得的过账数据:

请求对象的响应:

{ args:{}, 数据:{\lang\:\en\u ca\,\deviceType\:\desktop\,\country\:\ca\,\ddoKey\:\refineSearch\,\sortBy\:\,\subsearch\:\,\from\:100,所有\u字段\[],\pageName\:\search结果\,\counts\ \counts\ \jobs\ \true,\keywords\:\,\global\,\true,\size\:50,所选字段\:null,\sort\ \null}, 文件:{}, 表格:{}, 标题:{ 接受编码:身份, 内容长度:259, 内容类型:application/json, 主持人:httpbin.org, 用户代理:Python urllib/2.7 }, json:{ 所有字段:[], 国家:ca,, 伯爵:没错, ddoKey:优化搜索, 设备类型:桌面, 起:100,, 全球:没错, 乔布斯:没错, 关键词:, 朗:恩,可以, pageName:搜索结果, 所选字段:空, 尺码:50, 排序:null, 糟糕的是:, 子搜索: }, 来源:, 网址:http://httpbin.org/post } 与OpenDirector的回应:

{ args:{}, 数据:{\lang\:\en\u ca\,\deviceType\:\desktop\,\country\:\ca\,\ddoKey\:\refineSearch\,\sortBy\:\,\subsearch\:\,\from\:100,所有\u字段\[],\pageName\:\search结果\,\counts\ \counts\ \jobs\ \true,\keywords\:\,\global\,\true,\size\:50,所选字段\:null,\sort\ \null}, 文件:{}, 表格:{}, 标题:{ 接受编码:身份, 内容长度:259, 内容类型:application/json, 主持人:httpbin.org, 用户代理:Python urllib/2.7 }, json:{ 所有字段:[], 国家:ca,, 伯爵:没错, ddoKey:优化搜索, 设备类型:桌面, 起:100,, 全球:没错, 乔布斯:没错, 关键词:, 朗:恩,可以, pageName:搜索结果, 所选字段:空, 尺码:50, 排序:null, 糟糕的是:, 子搜索: }, 来源:, 网址:http://httpbin.org/post } 值得注意的是,httpbin提供的信息表明发布的数据完全相同,但由于某种原因,OpenDirector无法获得正确的响应

我想要的解决方案是让OpenDirector成功获得道具 er响应,而无需重新实现代码库以使用请求或请求对象


有人知道是什么导致了这种差异吗?

找到了解决办法。由于RBC端点是https,处理程序类也需要有https\u请求函数,而不仅仅是http\u请求

类ChangeTypeProcessorurllib2.BaseHandler: def http_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求 def https_requestself,请求: req.unredirected_hdrs[内容类型]=应用程序/json req.unredirected_hdrs[用户代理]=Python urllib/2.7 返回请求
我不明白为什么你对OpenDirector和httpbin的请求是相同的。500意味着问题已经到了尽头,如果问题与您的请求数据有关,那么实际上可能是400,但是,由于我没有看到该端点的任何API文档,所以真的没有办法知道。@Jack我以前的发现发现是OpenDirector在默认情况下将“Content Type”头更改为“application/x-www-form-urlencoded”,除非您添加了处理程序。这让我相信数据的发送方式有所不同,因为它导致JSON数据无法正确传输。不过,多亏了你的评论,我才明白为什么它不起作用。