当前位置: 首页 > 知识库问答 >
问题:

如何正确地将数据解析到我的改型客户机中,以便预制post请求[重复]

戚建德
2023-03-14

我试图通过POST请求将JSON发送到rest API。我遇到的问题是,我似乎无法找出/使用改型需要的数据类型(JSONArray,String,INT...等)以便将其发送到我的rest API。到目前为止,我只尝试了在字符串中硬编码JSON,并将其解析为referfit,希望它能够发布到rest API,并处理我使用什么类型的输入来赋予referfit以发布

当我尝试解析一个字符串时,我得到以下信息:com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_OBJECT但是String位于第1行、第1列、路径$。问题是我不知道要解析什么。

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

我的代码

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

这是我的改型API。字符串值是我认为给我带来麻烦的值,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")
                }
            }
    }

AddConverterFactory(GSONConverterFactory.Create(gson))我得到以下错误致命异常:DefaultDispatcher-Worker-1com.google.gson.stream.malformedJSONException:使用jsonReader.setlenient(true)在第1行第1列第1路径$接受格式错误的JSON

共有1个答案

江正德
2023-03-14

当应用.AddConverterFactory(GSONConverterFactory.Create(gson))行时,意味着referfit将您传递的每个有效负载视为Json对象。所以,当你传递一个简单的字符串时,你会得到这个错误。一个可能的修复方法是将string数组转换为json数组,如本文所述https://stackoverflow.com/A/10498107/404438。

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

以下是如何添加拦截器:

首先,在你的构建中。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()
 类似资料:
  • 问题内容: 到目前为止,我的代码: 我想发送with 方法的内容,但是我不知道如何将它们添加到请求的正文中。我需要帮助,因为在网络上,我只能找到如何添加args。 提前致谢。 问题答案: 您始终可以在Java SE中使用java.net API:

  • 冒充客户 客户端的控制器 } 编辑3:我添加了功能区 我的服务应用程序和我的api是使用虚假客户机。不幸的是,我仍然有同样的问题。我已经刷新和重建了一切。 编辑4:我已经为这个问题创建了一个GitHub项目。 输入输入模块使用输入格式和输入解析模块作为假客户机来验证输入字符串的长度和解析/打印项。我一直使用字母表作为输入,所以输入参数的最小长度设置为26。input-format在端口8080上运

  • 我们正在运行一个带有3个节点的ignite集群,它从第三方数据库(使用自定义缓存存储)预加载数据。当我们尝试使用java瘦客户机连接到集群时,如果请求在数据加载完成之前到达集群,我们会得到未知对异常和一些不稳定的行为。 堆栈跟踪

  • 问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。

  • 我试图找到使用httr包通过R连接Appannie的API的方法(根本没有API连接的经验)。API要求包含来自appannie网站的请求标题引用:注册App Annie帐户并生成API密钥。将此密钥添加到您的请求标头中,如下所示: 授权:持有人“”引用 我写了这样的代码 命令http_status(getdata)显示我"客户端错误:(401)未经授权"有人能帮我吗,我做错了什么?

  • 问题内容: 我已经在Java中生成了一个包含JSON对象的HTMLPost请求,并希望在PHP中对其进行解析。 并在服务器上 我猜这是因为JSON特殊字符已编码。 json_decode返回空响应 知道为什么吗? 问题答案: 实际上,您不是在发布实体,而是在发布具有单个值对json =(encoded json)的HTTP表单实体()。 代替 尝试