You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Retrofit发送纯字符串GET请求并接收非JSON字符串响应

解决Retrofit发送纯字符串GET请求并接收字符串响应的问题

看起来你已经走对了第一步(添加ScalarsConverterFactory),但核心问题出在接口定义的返回类型和查询参数的处理上,下面是具体的修正方案:

1. 修正接口定义:用Call<String>替代Call<ServerResponse>

你之前的接口返回ServerResponse类型,Retrofit会默认尝试用JSON转换器解析响应,但你需要的是纯字符串,所以必须把返回类型改成Call<String>。同时,因为你的查询参数是无键的纯字符串(比如?1231easc *eadd;5;),需要特殊处理@Query的配置:

方案A:动态传入完整URL(最直观)

如果你的查询串格式比较灵活,直接拼接完整URL后用@Url注解传入:

public interface ApiService {
    @GET
    Call<String> getRawStringResponse(@Url String fullUrl);
}

调用示例:

// 拼接完整请求URL
String baseUrl = "http://192.168.1.2:51276/deneme.aspx";
String rawQuery = "1231easc *eadd;5;";
String fullRequestUrl = baseUrl + "?" + rawQuery;

// 发起请求
apiService.getRawStringResponse(fullRequestUrl).enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        if (response.isSuccessful()) {
            // 直接获取纯字符串响应
            String rawResponse = response.body();
            // 处理你的响应内容:dsa<#12no password;+;#yes;
        }
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        // 处理请求失败逻辑
    }
});

方案B:保留固定路径,配置@Query为无键编码模式

如果想保留@GET("/deneme.aspx")的固定路径,需要给@Query设置encoded = true,避免Retrofit自动编码你的特殊字符(空格、*等):

public interface ApiService {
    @GET("/deneme.aspx")
    Call<String> getRawStringResponse(
        @Query(value = "", encoded = true) String rawQuery
    );
}

调用示例:

apiService.getRawStringResponse("1231easc *eadd;5;").enqueue(new Callback<String>() {
    // 同上的回调逻辑
});

2. 确保ScalarsConverterFactory的正确配置

一定要在Retrofit构建时优先添加ScalarsConverterFactory,如果同时使用了其他转换器(比如Gson),要把Scalars放在前面,这样Retrofit会优先用它处理String类型:

// 配置OkHttpClient(包含你的日志拦截器)
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .build();

// 构建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://192.168.1.2:51276/")
        // 优先添加ScalarsConverterFactory
        .addConverterFactory(ScalarsConverterFactory.create())
        // 如果需要JSON解析,再添加GsonConverterFactory(放在后面)
        // .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build();

// 创建接口实例
ApiService apiService = retrofit.create(ApiService.class);

为什么之前的代码不工作?

  1. 返回类型Call<ServerResponse>会让Retrofit尝试用JSON转换器解析响应,而你的响应是纯字符串,导致解析失败;
  2. 如果没有给@Query设置encoded = true,Retrofit会自动编码你的特殊字符(比如空格变成+,*变成%2A),导致请求URL不符合预期;
  3. 如果ScalarsConverterFactory被放在其他转换器后面,Retrofit可能不会用它来处理String类型。

内容的提问来源于stack exchange,提问作者ilvthsgm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:00:26