如何用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);
为什么之前的代码不工作?
- 返回类型
Call<ServerResponse>会让Retrofit尝试用JSON转换器解析响应,而你的响应是纯字符串,导致解析失败; - 如果没有给
@Query设置encoded = true,Retrofit会自动编码你的特殊字符(比如空格变成+,*变成%2A),导致请求URL不符合预期; - 如果
ScalarsConverterFactory被放在其他转换器后面,Retrofit可能不会用它来处理String类型。
内容的提问来源于stack exchange,提问作者ilvthsgm
相关产品推荐
相关产品推荐

