在retrofit2中,Call <string>在一个接口中正常工作,但相同的代码在其他接口

时间:2016-09-02 20:36:45

标签: java android retrofit2

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

我有以下代码接收String作为来自android中使用retrofit2库的服务器的响应。

第一种情况:

在以下代码中,它正常工作。

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);

}

此接口在某些类中用作:

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);

}

当我在某个类中以与上面相同的方式使用此接口时,它会将失败日志打印为:错误:使用JsonReader.setLenient(true)接受第1行第1行路径上格式错误的JSON $

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 在第二种情况下无法将响应解析为String。

Plz帮助任何人。 提前谢谢。

修改

服务器在第一种情况

中返回以下数据
response.getWriter().print("true");

第二种情况下:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

只有&#34;成功&#34; 不是 json字符串,直到我们包含双引号

Retrofit收到json响应,第一种情况下的响应为&#34; true&#34; ,在json中被视为布尔文字,因此没有错误。

但是在第二种情况下&#34;成功&#34; 根据json字符串不是格式正确。因此,如上所述修改它会消除错误。