0

我是 android studio 和 kotlin 的业余爱好者。但是,我正在设计一个应用程序,我在其中收集用户数据并需要以匿名方式将其发布到 AWS s3 而无需 cognito 身份验证。我已经完成了将图像上传到 aws S3 的示例,但是如何将我的 json 对象发布到 AWS S3。我已经阅读了一些文档,但我被困在transferutility.upload. 因为大多数用于上传的代码片段都在谈论一个文件,所以我冻结在那里,因为我只想发布我的对象。

我到目前为止所尝试的。接口代码:

interface IMyAPI {

@GET("child/{dynamic}/learningpods_new")
fun getDynamic(@Path("dynamic")dynamic:String):Observable<ArrayList<Data>>

@POST("parent/")
fun createParent(@Body parentDetails: ParentDetails):Call<ParentDetails>
}

我能够从指定的端点获取,但我不想发布到同一个端点。

改造代码:

object RetrofitClient {
private var OurInstance : Retrofit?=null
val instance:Retrofit
get() {
    if (OurInstance==null)
    {
        OurInstance =Retrofit.Builder()
                .baseUrl("http://coreapi.imagin8ors.org:8080/v1/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
    }
    return OurInstance!!
  }
}

发布代码片段:

val retrofit = RetrofitClient.instance
jsonAPI = retrofit.create(IMyAPI::class.java)
val call=jsonAPI.createParent(new_parent)
call.enqueue(object :Callback<ParentDetails>{
        override fun onFailure(call: Call<ParentDetails>?, t: Throwable?) {
            Toast.makeText(this@ParentmainActivity,"something went wrong",Toast.LENGTH_LONG).show()
        }

        override fun onResponse(call: Call<ParentDetails>?, response: Response<ParentDetails>?) {
            Toast.makeText(this@ParentmainActivity,"successful :"+response?.code(),Toast.LENGTH_LONG).show()
        }

    })

任何帮助表示赞赏。

4

1 回答 1

0

如果您想将对象发布到 AWS S3,有一个按名称的方法putObject可以将对象上传到 AWS S3。下面的代码片段是上传包含“名称”的对象的示例方法。您可以在指定的存储桶中找到相同的内容。

val background= object :Thread() {
        override fun run() {
            try {
                try {
                    AWSMobileClient.getInstance().initialize(baseContext)
                    credentials = BasicAWSCredentials(AWSutils().KEY,AWSutils().SECRET)
                    s3Client = AmazonS3Client(credentials)
                    val response=s3Client.putObject(AWSutils().bucket_name,"jsa3/NewParentData","name")
                } catch(e:AmazonServiceException) {
                    // The call was transmitted successfully, but Amazon S3 couldn't process
                    // it, so it returned an error response.
                    e.printStackTrace();
                }
                catch(e:AmazonClientException) {
                    // Amazon S3 couldn't be contacted for a response, or the client
                    // couldn't parse the response from Amazon S3.
                    e.printStackTrace();
                }
            }catch (e:Exception){
                e.printStackTrace()
            }
        }
    }
    background.start()

此外,上传不能在主线程上进行,因此您必须创建另一个线程来执行此上传,这就是上面代码中显示的内容。如果您问我如何知道对象是否已成功发布:一种方法是使用您的 aws s3 帐户签入您的存储桶,另一种方法是执行 agetobject并打印objectContent. 这应该向您表明您能够发布数据。

但是,可能存在一些问题:我们必须确保您上传的是对象,而不是对象的新实例。将对象上传到 aws s3 的另一件事是您不能附加数据,只会发生覆盖。所以,如果你想拥有一个对象的集合,那么使用该方法是不明智的——putObject这属于用例场景,可以进一步讨论。

于 2018-08-13T12:02:01.017 回答