我正在使用将Retrofit用于网络操作的应用程序。就目前而言,一切cout << stoi(nu_bits, nullptr, 2);
都可以很好地处理序列化。这是我设置GsonConverterFactory
Retrofit
现在,我需要连接到以Retrofit.Builder()
.baseUrl("<base url>")
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
格式返回内容的旧服务。这是Retrofit界面
text/plain; charset=utf-8
这将返回有效用户的呼叫状态。例如,如果用户有效并且有状态,则它将“ Active”作为纯文本返回。如果没有有效的用户,它将返回错误代码#1005
我可以添加自定义转换器工厂(在网络上找到)
@GET("https://<domain>/<endpoint>?Type=Query")
suspend fun callStatus(@Query("userId") id: Int): Response<String>
但是我没看到有什么不同。而且,它很可能将JSON伪装成普通文本并破坏所有现有服务。有没有更好的方法来处理这种情况?我想到了为纯文本单独设置改造实例,不过有点脏。您还有其他建议/解决方案吗?
已编辑
Response标头包含的内容类型为
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);
}
}
}
}
有效用户的实际答复
Content-Type: text/plain; charset=utf-8
无效用户的实际答复
Active
答案 0 :(得分:7)
注册转换器工厂的顺序很重要。 ScalarsConverterFactory
必须首先。
应该在构建Retrofit对象时通过添加ScalarsConverterFactory
来实现。
这可以与其他json转换器一起完成,例如
Retrofit.Builder()
.baseUrl("<base url>")
.client(client)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
在那之后,您应该能够接收纯文本响应。
您可能还需要将其添加到依赖项中:
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
答案 1 :(得分:0)
您不需要使用Converter.Factory
的自定义实现,就可以使用
// your coroutine context
val response = callStatus(userId)
if(response.isSuccessful){
val plainTextContent = response.body()
// handle plainText
} else {
//TODO: Handle error
}
//...
答案 2 :(得分:0)
以下是我如何以纯文本(使用Java而不是Kotlin)获得响应的方法。
第一步
在您的gradle(模块)中;
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
第二步
创建界面
public interface MyInterface {
@GET("something.php")
Call<String> getData(@Query("id") String id,
@Query("name") String name);
}
第三步
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://example.com")
.addConverterFactory(ScalarsConverterFactory.create())
.build();
MyInterface myInterface = retrofit.create(MyInterface.class);
Call<String> call = myInterface.getData("id","myname");
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String plain_text_response = response.body();
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
答案 3 :(得分:0)
首先要检查两件事,即函数不应被暂停,并且您的响应应在回调中
无需添加额外的标量实现。
@GET
fun getJson(
@Url baseUrl: String = slab_pro
): Call<DataClass>