如何正确地将数据解析到我的改造客户端中以执行发布请求[重复]

Posted

技术标签:

【中文标题】如何正确地将数据解析到我的改造客户端中以执行发布请求[重复]【英文标题】:How to parse data into my retrofit client correctly in order to preform a post request [duplicate] 【发布时间】:2021-05-19 21:31:49 【问题描述】:

我正在尝试通过 POST 请求将 JSON 发送到带有 Retrofit 的 rest API。我遇到的问题是,我似乎无法弄清楚/使用改造所需的 data(JSONArray, String, INT ...etc) 的类型,以便将其发布到我的休息 API。到目前为止,我只尝试在字符串中硬编码 JSON 并将其解析为 Retrofit,希望它 POST 到其余 API 并弄乱我输入的输入类型,以便对 POST 进行改造

当我尝试解析字符串时,我得到以下信息:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ 这个错误表明我没有解析 JSON。问题是我不知道要解析什么。

当我尝试解析 JSONarray 或 JSONobject 或任何其他类型的数据时,我的应用程序视图不会加载,我的应用程序会崩溃。

我的code

interface SimpleApi 
    @POST("posttest.php")
    suspend fun postit(@Body post: String): Phone

这是我的改造 API。String 值是我认为给我带来麻烦的那个,Phone 类是我用于我的 recylerview 的数据类。

    private fun TestGet() 
        val gson = GsonBuilder()
                .setLenient()
                .create()

        val api = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                  .addConverterFactory(GsonConverterFactory.create(gson))
                    .build()
                    .create(SimpleApi::class.java)

            GlobalScope.launch(Dispatchers.IO) 
                val response = api.postit(test)//it wants a JSONarray
                //the above wants some kind of JSON to work I was passing Strings instead
                try 
                  //here lies the app logic and recylerview setup
                catch (e: Exception)
                    println("you messed up the connection some how")
                
            
    

这个函数是我调用其余 API、解析和返回 JSON 以及处理业务逻辑的方式。

现在变量 test 本来就是一些东西,它只是一个硬编码的字符串,就像 private var test = "[\"text1\", \"text2\", \"text3\"]"private var test = """["text1", "text2", "text3"]""" 一样,这不起作用,我也尝试实现如上所述的 GSON 转换器没用。

感谢您的宝贵时间。

编辑 没有addConverterFactory(GsonConverterFactory.create(gson)) 我收到以下错误FATAL EXCEPTION: DefaultDispatcher-worker-1com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

【问题讨论】:

请添加 Okhttp 调试拦截器并发送 api 的响应,似乎服务的响应不是有效的 json @Amin 我该怎么做呢?我尝试添加它,但它无法编译,不过感谢您的提示。 【参考方案1】:

.addConverterFactory(GsonConverterFactory.create(gson)) 行在应用时意味着改造将您传递的每个有效负载视为 Json 对象。因此,当您传递一个简单的字符串时,您会收到该错误。 一个可能的解决方法是将您的字符串数组转换为 json 数组,如此处所述https://***.com/a/10498107/404438。

还要检查服务器响应是否为有效的 json,您可以通过添加日志拦截器来实现。

以下是添加拦截器的方法:

首先,在您的 build.gradle 中:

    implementation "com.squareup.retrofit2:retrofit:2.6.0"
    implementation "com.squareup.retrofit2:converter-gson:2.6.0"
    implementation "com.squareup.okhttp3:logging-interceptor:3.11.0"

然后:

val gson = GsonBuilder()
                .setLenient()
                .create()

  val builder = OkHttpClient().newBuilder()
        builder.readTimeout(120, TimeUnit.SECONDS)
        builder.connectTimeout(30, TimeUnit.SECONDS)

        if (BuildConfig.DEBUG) 
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BASIC
            builder.addInterceptor(interceptor)
        
  val client = builder.build()


  val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build()

【讨论】:

没有.addConverterFactory(GsonConverterFactory.create(gson)) 我收到以下错误E/androidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ @m.seigmiller 查看我编辑的关于如何转换为 json 数组的答案 好吧,好消息,它失败了。但我将HttpLoggingInterceptor.Level.BASIC 更改为HttpLoggingInterceptor.Level.BODY,我从我的xammp 服务器收到一个错误,说这是PHP 脚本的问题!谢谢你告诉我如何继续。

以上是关于如何正确地将数据解析到我的改造客户端中以执行发布请求[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将 Kal 框架添加到我的 iPhone 项目中?

如何正确地将log4j Logger对象实例化到我的类中?

表单没有正确地将数据插入数据库 [Laravel][Eloquent]

正确地将我的按钮链接到我的视图(在 UINavigationController 中)?

如何将改造 JSON 响应转换为列表?

如何正确地将 JSP 放入 WEB-INF 中?