如何将REST API响应(以二进制数据形式)写入zip文件?

2020-09-14 03:45发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好!

我尝试为SAP CPI构建DevOps。 为此,我需要将iFlow下载到本地计算机。 我发送了API REST请求 https://host.com/api/v1/IntegrationDesigntimeArtifacts(Id ='someId',Version ='1.0.0')/$ value 并以二进制数据形式获得响应。 (内容已被主持人删除)

在标题中,我看到了Content-Type→应用程序/zip。 数据是zip文件。

我需要将响应写入文件并解压缩文件以浏览其中的文件。

有人知道谁可以用Java或python来获得它吗? 每次尝试时-我的存档已损坏

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好!

我尝试为SAP CPI构建DevOps。 为此,我需要将iFlow下载到本地计算机。 我发送了API REST请求 https://host.com/api/v1/IntegrationDesigntimeArtifacts(Id ='someId',Version ='1.0.0')/$ value 并以二进制数据形式获得响应。 (内容已被主持人删除)

在标题中,我看到了Content-Type→应用程序/zip。 数据是zip文件。

我需要将响应写入文件并解压缩文件以浏览其中的文件。

有人知道谁可以用Java或python来获得它吗? 每次尝试时-我的存档已损坏

付费偷看设置
发送
4条回答
95年老男孩
1楼-- · 2020-09-14 04:04

我曾尝试通过httprequest方法在Jenkins中实现。 该方法可能响应已损坏。 我已经用python完成了

我的下面的代码

响应= request.get(URL,标头=标头,流=真)

以open("%s/flow.zip"%(workspace),'wb')作为f:

responce.raw.decode_content =真

shutil.copyfileobj(responce.raw,f)

SAP小黑
2楼-- · 2020-09-14 04:10

嗨,瓦迪姆,

为了提供帮助,最好提供一些源代码和您面临的错误。
可以使用多种方式(类)将文件资源下载为zip文件(二进制)。 。

二进制文件损坏的原因也可能与浏览器缓存或代理设置有关。

请提供有关您的操作方式的更多详细信息。

关于,
伊万

打个大熊猫
3楼-- · 2020-09-14 04:21

嗨,瓦迪姆,

很遗憾,我没有租户访问权限,无法重现您的确切错误。

我能做的是在Linux中使用cURL bash命令以zip格式下载设计时间,这可以在Jenkins脚本中使用。

检索zip文件的命令可能很简单:

卷曲'https:// -tmn.hci。 .hana.ondemand.com/itspaces/api/1.0/workspace/?export = true'-H'apikey:'-H'Cookie:''-H'Accept-Encoding:gzip,deflate,br'-H'Connection:keep-alive'--compressed -o  

注意:您必须使用正确的api路径替换URL。 我要显示的是Web UI用于下载工件的URL。 我是通过进入Chrome开发者工具(F12)上的"网络"标签并通过右键单击请求将网址复制为curl(bash)来实现的。 不要忘记apikey标头参数,否则请使用身份验证参数将您的编码密码发送到服务。

现在,为了进行编码(如果这更多的话,则是您的事情)。 以下Python代码对我有用。

导入关闭
 汇入要求

 url ='http://ftp.gnu.org/gnu/windows/emacs/libXpm-3.5.7-w32-src.zip'
 响应= request.get(URL,stream = True)
 使用open('libXpm-3.5.7-w32-src.zip','wb')作为out_file:
     shutil.copyfileobj(response.raw,out_file)
 回复

 

因此,它应该适合您的用例。 您使用的是基本身份验证还是API密钥?

或者,我还可以使用Python通过其他几种方式下载文件,例如:

导入urllib.request,urllib.parse,urllib.error
 
 url ='http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'
 
 打印("使用urllib下载")
 urllib.request.urlretrieve(url," code.zip")
 
 打印("使用urllib2下载")
 f = urllib.request.urlopen(URL)
 数据= f.read()
 使用open(" code2.zip"," wb")作为代码:
     code.write(数据)
 

和:

导入关闭
 汇入要求

 url ='https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
 target_path ='alaska.zip'

 响应= request.get(URL,stream = True)
 句柄=打开(target_path," wb")
 对于response.iter_content(chunk_size = 512)中的块:
     如果块:#过滤掉保持活动的新块
         handle.write(块)
 handle.close()
 

更不用说在Java上使用Spring Boot Starter Web了:

 @GetMapping("/img/getzipfile")
     公共ResponseEntity  getzipfile()引发IOException {
    
    //使用字节数组初始化消息转换器
     List > messageConverters =新的ArrayList >();
     messageConverters.add(new ByteArrayHttpMessageConverter());
    
    //使用新的消息转换器创建其余模板
     RestTemplate restTemplate =新的RestTemplate(messageConverters);
    
    //设置标头以接受来自服务器的二进制格式
         HttpHeaders标头=新的HttpHeaders();
         headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
         HttpEntity 实体=新的HttpEntity (headers);
        
         ResponseEntity  response = restTemplate.exchange(
                 " http://ftp.gnu.org/gnu/windows/emacs/libXpm-3.5.7-w32-src.zip",
                 HttpMethod.GET,实体,byte []。class," 1");
        
         如果(response.getStatusCode()== HttpStatus.OK){
             Files.write(Paths.get(" libXpm-3.5.7-w32-src.zip"),response.getBody());
         }
         返回响应;
     }
 

没有任何情况使用返回二进制数据的REST服务。 但是,无论基础协议/接口如何,它们都应该起作用。

可能会将您将结果视为String而不是字节数组。

关于,
伊凡

灬番茄
4楼-- · 2020-09-14 04:16

感谢您的回答! 这非常有用

一周热门 更多>