Android 上传到Google Publisher 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/

我一直在尝试开发一个应用程序,帮助我通过CLI上传一堆APK。我正在使用,我决定在scala中编写cli,并使用ApacheHttpClient进行API调用。我上传的代码是:

 
    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
  }