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

使用改型从服务器读取纯文本响应

翟兴邦
2023-03-14
Retrofit.Builder()
        .baseUrl("<base url>") 
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
@GET("https://<domain>/<endpoint>?Type=Query")
suspend fun callStatus(@Query("userId") id: Int): Response<String>

这将返回有效用户的调用状态。例如,如果用户是有效的,并且存在状态,则以纯文本形式返回“Active”。如果没有有效用户,则返回#1005的错误代码

我可以像这样添加自定义转换器工厂(在web上找到)

final class StringConverterFactory implements Converter.Factory {
    private StringConverterFactory() {}

    public static StringConverterFactory create() {
        return new StringConverterFactory();
    }

    @Override
    public Converter<String> get(Type type) {
        Class<?> cls = (Class<?>) type;
        if (String.class.isAssignableFrom(cls)) {
            return new StringConverter();
        }
        return null;
    }

    private static class StringConverter implements Converter<String> {
        private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8");

        @Override
        public String fromBody(ResponseBody body) throws IOException {
            return new String(body.bytes());
        }

        @Override
        public RequestBody toBody(String value) {
            return RequestBody.create(PLAIN_TEXT, convertToBytes(value));
        }

        private static byte[] convertToBytes(String string) {
            try {
                return string.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

但我没看到有什么不同。此外,它还可以很好地将JSON伪装成普通文本,并破坏所有现有服务。有没有更好的方法来处理这种情况?我想过为纯文本提供单独的改型实例,虽然有点脏。你还有其他的建议/解决办法吗?

Active
#1005

共有1个答案

颛孙嘉石
2023-03-14

您注册转换器工厂的顺序很重要。ScalarsConverterFactory必须放在前面。

在构建referfit对象时添加ScalarsConverterFactory应该是可行的。

Retrofit.Builder()
        .baseUrl("<base url>") 
        .client(client)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

之后,您应该能够收到明文响应。

implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
 类似资料:
  • 问题内容: 我正在尝试使用来自Python的SSH从服务器读取文件。我正在使用Paramiko进行连接。我可以连接到服务器并运行类似的命令,然后从服务器获取数据,但是我尝试读取的某些文件的大小约为1 GB或更大。 如何使用Python在服务器上逐行读取文件? 附加信息:通常要做的是运行命令并将结果存储在变量中并加以解决。但是由于这里的文件很大,我正在寻找一种从服务器逐行读取文件的方法。 编辑:我可

  • 您的应用程序可能需要通用的纯文本配置文件,而不是使用Environment抽象(或YAML中的其他替代表示形式或属性格式)。配置服务器通过/{name}/{profile}/{label}/{path}附加的端点提供这些服务,其中“name”,“profile”和“label”的含义与常规环境端点相同,但“path”是文件名(例如log.xml )。此端点的源文件位于与环境端点相同的方式:与属性或

  • 我正在从sftp服务器读取文件,并使用Spring Batch Framework将该文件加载到数据库中。下面是我的代码,但我遇到了一个错误 代码: 错误:

  • 问题内容: 我的服务器中有一个包含此信息的文本文件: 如何使用PHP从文本文件中逐行读取所有信息? 问题答案: 这将使您逐行阅读..阅读php.net/fgets上有关Mac的行尾问题的注释。

  • 问题内容: 我正在尝试通过jSch0.1.49库连接在Unix服务器上运行命令。我浏览了jSch甚至http://sourceforge.net/apps/mediawiki/jsch/index.php?title=Official_examples提供的示例 我能够从服务器读取响应并将其打印到控制台,但循环* 永无止境 * g。我怀疑为什么Channele一旦完成从服务器读取响应就没有关闭。

  • 我在生产环境中使用redis server,在HA中使用redis Sentinel。但是阅读文档,当客户机连接到sentinel时,sentinel将主redis服务器提供给客户机。 是所有的读写操作都在主服务器上进行,而从服务器只用于故障转移,还是我们可以使用从服务器读取数据?