为什么我的 android 应用程序无法在服务器上读取 JSON?

Why is my android application not able to read JSON on server?

提问人:user1867845 提问时间:10/25/2023 最后编辑:halferuser1867845 更新时间:10/27/2023 访问量:44

问:

我距离将应用程序发布到 Android PlayStore 只有一步之遥。但是,我遇到了一个问题,那就是我的 Android 应用程序(用 Kotlin 编写)无法读取我的服务器 (dreamhost.com) 上的 Json 文件。JSON 的 URL 位于:https://apis.androidparadise.site/contacts/Contacts.json

    data class ContactResponseItem(
       val comment: String?,
       @SerializedName("data")
       val dataList: List<Data?>,
       val database: String?,
       val name: String?,
       val type: String?,
       val version: String?
    )

我的界面是:

        interface ContactApi {
           @GET("/contacts/Contacts.json")
           suspend fun getAllContacts() : Response<List<ContactResponseItem>>
           @POST("/contacts/new")
           suspend fun addContact(@Body contact:ContactResponseItem): 
           Response<ContactResponseItem>
        }  

我的存储库是:

        interface ContactsRepository {
            suspend fun getAllContacts(): Resource<List<ContactResponseItem>>
            suspend fun addContact(contact: ContactResponseItem): 
        Resource<ContactResponseItem>
    }   

我的默认存储库是:

     class ContactsRepositoryImpl @Inject constructor(private val api: ContactApi):
ContactsRepository {
override suspend fun getAllContacts(): Resource<List<ContactResponseItem>> {
    return try {
        val response = api.getAllContacts()
        val result = response.body()

        if (response.isSuccessful && result != null) {
           Resource.Success(result)

        }
        else {
            Resource.Error("Response was not successful")
        }

    }catch (e: Exception){
        Resource.Error (e.message ?: "Failed to retrieve contacts")
    }
}



override suspend fun addContact(contact: ContactResponseItem): Resource<ContactResponseItem> {

    return try {
        val response = api.addContact(contact)
        val result = response.body()

        Log.d("ContactsRepositoryImpl", response.isSuccessful.toString())
        Log.d("ContactRepositoryImpl", (result != null).toString())
        if (response.isSuccessful && result != null) {
             Resource.Success(result)
        }
        else {
            Resource.Error("Response was not successful")
        }

    }catch (e: Exception){
        Resource.Error (e.message ?: "Failed to retrieve contacts")
    }


}

我的 ViewModel 方法之一:

       fun getContactEmails(): MutableList<String> {

    viewModelScope.launch(dispatchers!!.io) {
        when (val loadResponse = contactsRepo.getAllContacts()) {

            is Resource.Success ->{

                for(i in 0..loadResponse.data?.size!!){
                    if (loadResponse.data[i].name == "data") {
                        val dataLoad = loadResponse.data[i].dataList[0]
                        dataLoad?.let { emailList.add(it.email) }
                    }

                }


              _recipientload.value = RecipientLoadingEvent.Success("The first email found: ${emailList[0]}")

            }
            is Resource.Error<*> -> RecipientLoadingEvent.Failure("Couldn't load client's emails")
            else -> _recipientload.value =
                RecipientLoadingEvent.Failure(loadResponse.errorMsg.toString())
        }

    }
    return emailList
}

最后,主要活动中的一种方法:

       contactsVM.recipientLoad.collect { event ->
            when (event) {
                is ContactsViewModel.RecipientLoadingEvent.Success -> {
                   Toast.makeText(this@CreateNewUserRegistration, contactsVM.getContactEmails()[0], Toast.LENGTH_SHORT).show()

                }

                is ContactsViewModel.RecipientLoadingEvent.Failure -> {
                    Toast.makeText(
                        this@CreateNewUserRegistration,
                         "Failed to retrieve email",
                        Toast.LENGTH_LONG
                    ).show()

                    Toast.makeText(
                        this@CreateNewUserRegistration,
                        "Failed to send data to server",
                        Toast.LENGTH_SHORT
                    ).show()

                }


                else -> {}
            }
        }

出于某种原因,在主活动中,when 语句中的事件变量返回 ContactsViewModel.RecipientLoadingEvent.Error 而不是 ContactsViewModel.RecipientLoadingEvent.Success。我只收到两个无法检索数据的 Toast。我没有收到来自视图模型的任何错误消息。这只会让我相信 JSON 文件的读取/上传没有正确完成。

Android JSON Kotlin

评论

0赞 blackapps 10/25/2023
好吧,上传是可以的,因为您的链接提供了一个很好的文件。
0赞 blackapps 10/25/2023
这么多代码。出了什么问题?你首先必须下载野兽。现在你能吗?下载后,您可以处理数据。你没有告诉你正在遵循的场景。所以我现在没有阅读所有这些代码。
0赞 CommonsWare 10/25/2023
将问题的详细信息记录到 Logcat。特别是,在您的块中,将异常记录到 Logcat 中。然后,检查 Logcat 输出以查看出了什么问题。catch
0赞 user1867845 10/25/2023
@CommonsWare,嘿,兄弟,我已经尝试了很多log.d(),但它没有向我显示任何信息。由于某种原因,日志没有显示在 Logcat 中。我也尝试了断点,看看发生了什么,以及我是否收到JSON文件。相反,在“调试”面板中,尽管我已经使用“debuggable true”在 Build.gradle 中启用了调试,但我还是收到此消息“变量调试信息不可用”。不过,似乎唯一有效的是 Toasts 来获取我的信息。
0赞 user1867845 10/25/2023
@blackapps我知道您可以下载 JSON 并在本地提供数据,但我认为通过在 Android Manifest 中提供 Internet 权限,我不应该对吗?我包含的 URL 有效,并且包含在 ContactsApi 中的相对 URL 应该是正确的,因为我试图查看它是否显示在 Postman 中,它确实如此。

答: 暂无答案