在 retrofit2 中,Call<String> 在一个界面中工作正常,但相同的代码在其他界面中不起作用

In retrofit2, Call<String> is working fine in one interface but the same code is not working in other interface

我已经找到了很多关于我在改造中收到的错误的答案,但我有一些我无法理解的不同问题。

我有以下代码使用 retrofit2 库从 android 中的服务器接收字符串作为响应。

第一种情况:

在下面的代码中它工作正常。

CardService.java

package com.go.gocard.card;

import com.go.gocard.model.Card;
import com.go.gocard.model.JsonResponse;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;


public interface CardService {

@POST("savecard")
Call<String> sendCard(@Body Card card);

}

此接口在某些 class 中使用为:

public void sendCard(Card card) {

    Retrofit retrofit = = new Retrofit.Builder()
            .baseUrl(context.getString(CardResources.BASE_URL))
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    CardService service = retrofit.create(CardService.class);
    Call<String> resp = service.sendCard(card);
    resp.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            Toast.makeText(context,response.body(),Toast.LENGTH_SHORT).show();
            seeOthers();
            Log.d("Success","Sa");
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            Toast.makeText(context,t.getLocalizedMessage(),Toast.LENGTH_SHORT).show();
            Log.d("Failure_Reason",t.getMessage());
        }
    });
}

这在打印日志时成功运行 成功:Sa

第二种情况:

虽然我有另一个界面:

LoginService.java

package com.go.gocard.loginAndRegister;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

/**
* Created by dhruvam on 02/09/2016.
 */
public interface LoginService {

@POST("registration")
@FormUrlEncoded
Call<String> register(@Field("email") String emailId, @Field("pass") String pass);

}

并且当我以与上述相同的方式在某些 class 中使用此接口时,它会将失败日志打印为: error: Use JsonReader.setLenient(true) to accept malformed JSON 在第 1 行第 1 列路径 $ :

public void register(View v)
{
    if(validated())
    {
        task = "register";

       Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(context.getResources().getString(R.string.base_url))
                .addConverterFactory(GsonConverterFactory.create())
                .build();

       LoginService service = retrofit.create(LoginService.class);
       Call<String> resp = service.register(email, pass);
       resp.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    Log.d("message",response.body());
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Log.d("error",t.getMessage());
                }
            });

    }
}

两种情况都来自同一个 android 应用程序。

服务器在这两种情况下都只是简单地返回字符串,那么为什么仅在第二种情况下会出现错误,而在第一种情况下它可以正常工作。 为什么 GsonConverterFactory 在第二种情况下无法将响应解析为字符串。

请帮助任何人。 提前致谢。

编辑:

服务器returns以下数据在第一种情况下:

response.getWriter().print("true");

第二种情况下:

response.getWriter().print("success");

我在 github.com 上找到了解决方案,但他们因为愚蠢的问题而删除了这个问题。

错误不在改造中,而是在服务器发送的响应中。

我将第二种情况中的响应修改为:

response.getWriter().print("\"success\""); // making it a json string by including double quotes

只有 "success" 不是 json 字符串 直到我们包含 双引号

Retrofit 收到 json 响应,第一种情况下的响应是 "true",在 json 中被视为布尔文字,因此没有错误 .

但在第二种情况下,"success" 未根据 json 字符串正确格式化。因此,如上修改它可以消除错误。