问题背景
最近想通过华为AppGallery Connect提供的Publishing API来向华为应用市场上传软件包以更新我的已上架应用,我按照官网文档的指导调用相关接口设置我的应用,我先是调用了上传文件接口上传软件包,然后又调用更新应用文件信息接口想要将上传的软件包与自己的应用绑定,却遇到了如下报错:
{'result': {'CException': {'errorCode': 70001405, 'errorDesc': 'get no file from request!'}, 'resultCode': '70001405'}}
一开始很奇怪,难道文件没有上传成功么?于是我看了一下调用接口的数据流情况
发现是有数据上传的,那为什么会报没有文件呢?
解决方法
我上传文件的代码如下:
def uploadApp(authCode, uploadUrl, accessToken):
header = {
'client_id': clientId,
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'multipart/form-data'
}
req_body = {
'authCode': authCode,
'fileCount': 1
}
params = {
'appId': appId,
}
with open(aabPath, 'rb') as f:
prep = requests.post(uploadUrl,
files={apkName: f},
data=req_body,
headers=header)
logSuccess("Upload prep")
if prep.status_code == 200:
j = prep.json()
print(j)
body = {
'fileType': 5,
'files': [{
'fileName': aabName,
'fileDestUrl': j['result']['UploadFileRsp']['fileInfoList'][0]['fileDestUlr'],
'size': str(j['result']['UploadFileRsp']['fileInfoList'][0]['size'])
}]
}
upload = requests.put(baseApi + "/publish/v2/app-file-info",
headers=header,
json=body,
params=params)
if upload.status_code == 200:
logSuccess("Upload complete!")
return upload
else:
logError(upload)
else:
logError(prep)
可以看到我将files文件放在了python requests.post方法的入参中并且在header中将content type设置为了multipart/form-data。根据文档描述,提交接口请求的content type需要为multipart/form-data。这里我犯了两个错误:第一个就是files文件的key值需要是file,而不是我设置的apkName,但是修改成file后还是会报同样的错误。和小伙伴研究了很久,发现原来这里不需要声明content-type为multipart/form-data,因为请求中还有其他参数,需要为json形式,如果在header中声明content type为multipart/form-data则会影响到其他参数,导致文件上传失败。所以正确的header如下:
header = {
'client_id': clientId,
'Authorization': 'Bearer ' + accessToken,
}
总结
参考文档:Publishing API开发指南
欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh