【问题标题】:Retrofit Send String -No Json改造发送字符串 - 无 Json
【发布时间】:2026-02-02 13:40:02
【问题描述】:

我想通过 Retrofit 将字符串作为获取请求发送,并将响应作为字符串获取。为了更清楚,我不想使用 Json。

发送数据示例:

http://192.168.1.2:51276/deneme.aspx?1231easc*eadd;5;

响应数据示例:

dsa

界面:

@GET("/deneme.aspx")
    Call<ServerResponse> get(
            @Query("") String method
    );

我添加了ScalarsConverterFactory,但不允许我只使用字符串。

public void loginGet(String strg_no){

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(logging);
        Retrofit retrofit = new Retrofit.Builder()
                .client(httpClient.build())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(SERVER_URL)
                .build();

        Log.d("SIGNAL", "strg_no: " + strg_no);
        Interface service = retrofit.create(Interface.class);

        Call<ServerResponse> call = service.get(strg_no);

        call.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
                // response.isSuccessful() is true if the response code is 2xx
                BusProvider.getInstance().post(new ServerEvent(response.body()));
                Log.d("SIGNAL", "response body : " + response.body());
                Log.e(TAG,"Success");
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {
                // handle execution failures like no internet connectivity
                BusProvider.getInstance().post(new ErrorEvent(-2,t.getMessage()));
            }
        });
    }

服务器响应:

public class ServerResponse {
    @SerializedName("returned_ strg_no")
    private String strg_no;
    @SerializedName("error_code")
    private int errorCode;
    private int status = 1;
    private String error;

    public ServerResponse(String strg_no, int errorCode, int status, String error){
        this. strg_no = strg_no;
        this.errorCode = errorCode;
        this.status = status;
        this.error = error;
    }

    public String getstrg_no() {
        return strg_no;
    }
}

服务器事件:

public class ServerEvent {
    private ServerResponse serverResponse;

    public ServerEvent(ServerResponse serverResponse) {
        this.serverResponse = serverResponse;
    }

    public ServerResponse getServerResponse() {
        return serverResponse;
    }

    public void setServerResponse(ServerResponse serverResponse) {
        this.serverResponse = serverResponse;
    }
}

如何在不使用 Json 的情况下发送和获取数据?

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    尝试@Path 而不是@Query

    @GET("/deneme.aspx{query}")
    Call<ServerResponse> get(@Path("query") String method);
    

    然后这样调用

    Call<ServerResponse> call = service.get("?"+strg_no);
    

    或者

    尝试使用动态网址

    @GET
    Call<ServerResponse> get(@Url String url);
    

    然后这样调用

    Call<ServerResponse> call = service.get("http://192.168.1.2:51276/deneme.aspx?"+strg_no);
    

    【讨论】:

    • 感谢您的回答。如果我使用 EncodedPath 会发生错误,并且根据 Retrofit 的文档,EncodedPath 已被弃用。如果我使用Path,它可以工作,但不是"?",而是%3F。显然这是一个编码问题。有什么解决办法吗?
    【解决方案2】:

    我希望它会帮助你!

    @GET("/deneme.aspx")
    Call<ResponseBody> get(
            @Query("") String method
    );
    
    
    Call<ResponseBody> call = service.get(strg_no);
    
      call.enqueue(new Callback<ResponseBody>() {
      @Override
      public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
       // handle success
       String result = response.body().string();
    
     }
    
      @Override
      public void onFailure(Throwable t) {
       // handle failure
      }});
    

    【讨论】:

    • 我遇到了一个问题:Cannot resolve symbol 'ResponseBody'. 我更改为ServerResponse ,但它也不起作用。我也将Interface Call 更改为ResponseBody 但没有机会。