在 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 字符串正确格式化。因此,如上修改它可以消除错误。
我已经找到了很多关于我在改造中收到的错误的答案,但我有一些我无法理解的不同问题。
我有以下代码使用 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 字符串正确格式化。因此,如上修改它可以消除错误。