Android 上传到Google Publisher API
我一直在尝试开发一个应用程序,帮助我通过CLI上传一堆APK。我正在使用,我决定在scala中编写cli,并使用ApacheHttpClient进行API调用。我上传的代码是:Android 上传到Google Publisher API,android,scala,apache-httpclient-4.x,Android,Scala,Apache Httpclient 4.x,我一直在尝试开发一个应用程序,帮助我通过CLI上传一堆APK。我正在使用,我决定在scala中编写cli,并使用ApacheHttpClient进行API调用。我上传的代码是: def uploadApk(packageName: String, editId: String, accessToken: String, fileName: String) = { val packageApklListUrl = "https://www.googleapis.com/
def uploadApk(packageName: String, editId: String, accessToken: String, fileName: String) = {
val packageApklListUrl = "https://www.googleapis.com/upload/androidpublisher/v2/applications/" +
packageName + "/edits/" + editId + "/apks?uploadType=media&access_token=" + accessToken
val httpclient = HttpClientBuilder.create.build
val httppost = new HttpPost(packageApklListUrl)
val file = new File(fileName)
val contentType = ContentType.create("application/octet-stream")
val mpEntity = MultipartEntityBuilder.create
mpEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
mpEntity.addBinaryBody("apk", file, contentType, fileName)
val builtEntity = mpEntity.build
httppost.addHeader("Content-Type", "application/octet-stream")
httppost.setEntity(builtEntity)
val response = httpclient.execute(httppost)
val resEntity = response.getEntity.getContent
Source.fromInputStream(resEntity).getLines.mkString
}
编辑id和访问令牌应该是正确的,因为它在应用程序的其余部分工作
我上传的代码来自
我还尝试过使用curl,以防http客户端使用多部分实体时出现问题。我使用的旋度是:
curl --data-binary @"[apk name]" -v --header "Content-Type: application/octet-stream" --header "Authorization: Bearer [access token]" -X POST "https://www.googleapis.com/upload/androidpublisher/v2/applications/[package name]/edits/[edit id]/apks?uploadType=media"
就卷曲而言,这是一个合法的无效APK。这让我很反感,因为它可以很好地上传到web界面上。我得到了我的apk的一个更新版本,它工作了
至于scala,事实上它是以包含所需内容类型的多部分内容类型发送的。这将导致谷歌拒绝。我的函数的更新版本为:
def uploadApk(packageName: String, editId: String, accessToken: String, fileName: String) = {
val packageApklListUrl = "https://www.googleapis.com/upload/androidpublisher/v2/applications/" +
packageName + "/edits/" + editId + "/apks?uploadType=media"
val httpclient = HttpClientBuilder.create.build
val httppost = new HttpPost(packageApklListUrl)
val file = new File(fileName)
val contentType = ContentType.create("application/octet-stream")
val fileEntity = new FileEntity(file,contentType)
httppost.addHeader("Content-Type", "application/octet-stream")
val authHeader = new BasicHeader("Authorization","Bearer " + accessToken)
httppost.addHeader(authHeader)
httppost.setEntity(fileEntity)
val response = httpclient.execute(httppost)
val resEntity = response.getEntity.getContent
Source.fromInputStream(resEntity).getLines.mkString
}
使用FileEntity而不是MultipartEntityBuilder
def uploadApk(packageName: String, editId: String, accessToken: String, fileName: String) = {
val packageApklListUrl = "https://www.googleapis.com/upload/androidpublisher/v2/applications/" +
packageName + "/edits/" + editId + "/apks?uploadType=media"
val httpclient = HttpClientBuilder.create.build
val httppost = new HttpPost(packageApklListUrl)
val file = new File(fileName)
val contentType = ContentType.create("application/octet-stream")
val fileEntity = new FileEntity(file,contentType)
httppost.addHeader("Content-Type", "application/octet-stream")
val authHeader = new BasicHeader("Authorization","Bearer " + accessToken)
httppost.addHeader(authHeader)
httppost.setEntity(fileEntity)
val response = httpclient.execute(httppost)
val resEntity = response.getEntity.getContent
Source.fromInputStream(resEntity).getLines.mkString
}