java - 使用 Retrofit 2 发布原始 JSON
问题描述
我从另一个应用程序收到了一个大的 JSON 对象,我必须使用 Retrofit 2 对 API 进行后调用。我在这个主题上找到的所有示例或主题都使用 JSONObject 或 Map。这意味着我必须解析我的字符串 (JSON) 才能创建 JSONObject 或 Map。
但我想以某种方式直接将我的字符串放入体内。
我试过这种方式,但它不起作用:
@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);
这样我发送一个作为正文转义的字符串,我的 JSON 看起来很奇怪: screenshot
解决方案
您需要将 Scalars Converter 添加到 Gradle 依赖项列表中,这将负责将 java.lang.String 对象转换为 text/plain 请求正文,因为 Retrofit 默认使用 Gson 转换器。检查此链接以获取最新版本。
https://search.maven.org/search?q=g:com.squareup.retrofit2%20a:converter-scalars
dependencies {
implementation “com.squareup.retrofit2:converter-scalars:2.4.0”
..
}
然后,您需要将正确的转换器工厂传递给您的 Retrofit 构建器。稍后它将告诉 Retrofit 如何转换传递给服务的 @Body 参数。
val retrofit = Retrofit.Builder()
.client(okHttpClient)
.baseUrl("/")
.addConverterFactory(ScalarsConverterFactory.create())
.build()
在此之后,是时候使用 String body 参数设置 Retrofit 服务了。
@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);
推荐阅读
- regex - 我需要一个正则表达式,它将返回字符串的空格分隔内容
- google-apps-script - 如何在 OnEdit 函数中使用 Vlookup
- python - 如何在 RDD 中选择每个键的最旧时间的数据?
- amazon-web-services - 将 aws 凭据(accessKey 和 secretKey)提供给像 BitBucket 这样的代码托管方是否安全?
- mysql - mysql LEFT JOIN 在行号上
- javascript - 单击 iframe 内部时页面滚动到顶部
- javascript - Babel loader 崩溃 npm build
- python - 如何在 stanfordrdnlp python 包中使用没有变音符号的阿拉伯语单词的引理?
- python - 通过保存部分结果并访问它来节省编译时间
- c# - 在 Vala 语言中有一个类似 `Buffer.BlockCopy` 或 `BitConverter。ToXXXX () || GetBytes`?