我找到了许多我在改造中收到的错误的答案,但我有一些我无法理解的不同问题。
我有以下代码接收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");
答案 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字符串不是格式正确。因此,如上所述修改它会消除错误。