使用翻新从服务器读取纯文本响应

时间:2020-07-14 18:00:01

标签: android kotlin retrofit retrofit2 okhttp

我正在使用将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

4 个答案:

答案 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>