【发布时间】:2020-11-04 03:30:50
【问题描述】:
我正在开发一个使用 Retrofit 进行网络操作的应用程序。就目前而言,GsonConverterFactory 处理序列化一切正常。这是我如何设置Retrofit
Retrofit.Builder()
.baseUrl("<base url>")
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
现在我需要连接到以text/plain; charset=utf-8 格式返回内容的旧服务。这是改造界面
@GET("https://<domain>/<endpoint>?Type=Query")
suspend fun callStatus(@Query("userId") id: Int): Response<String>
这将返回有效用户的呼叫状态。例如,如果用户有效并且有状态,它会以纯文本形式返回“活动”。如果没有有效用户,则返回错误码#1005
我可以像这样添加自定义转换器工厂(在网络上找到)
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 伪装成普通文本并破坏所有现有服务。有没有更好的方法来处理这种情况?我想为纯文本设置单独的改造实例,虽然有点脏。您还有其他建议/解决方案吗?
已编辑
响应头包含的内容类型为
Content-Type: text/plain; charset=utf-8
有效用户的实际响应
Active
无效用户的实际响应
#1005
【问题讨论】:
-
嗨。您是否尝试过使用 okhttp 获取原始 html 并检查 Response.body “Active”中是否存在。还是您肯定需要改造?
-
这对我来说很好stackoverflow.com/a/41138352/6478047。试一试
标签: android kotlin retrofit retrofit2 okhttp