【问题标题】:How do I fix a java.lang.IllegalStateException,when making a Retrofit 2.0 GET request?发出 Retrofit 2.0 GET 请求时,如何修复 java.lang.IllegalStateException?
【发布时间】:2018-02-09 02:42:04
【问题描述】:

当在这个 url 上发出 GET 请求时,我得到 JSON:

http://52.74.115.250:8080/api/orders?startDay=1&startYear=2017&startMonth=1&endYear=2018&endMonth=2&endDay=9&isAll=true"

当我在 android 中使用改造库尝试此操作时,出现此错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $

我的代码如下。

RetrofitClient.java

public class RetrofitClient {
   public static Retrofit retrofit;
   public static Gson gson;

   public static Retrofit getClient(String baseUrl)
   {

       if(retrofit==null) {
          gson = new GsonBuilder() .setLenient().create();

           retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create(gson)).build();
       }
       return retrofit;
   }

}

ApiInterface.java

public interface ApiInterface {
    @FormUrlEncoded
    @POST("local?")
    Call<AuthResponse> loginm(@Field("email") String username, @Field("password") String password);
    @GET("/orders?startDay=1&&startYear=2017&&startMonth=1&&endDay=1&&endYear=2018&&endMonth=1")
    Call<OrderList> getOrder(@Header("Authorization") String authorization, @Header("language")String language);

}

ApiUtils.java

public class ApiUtils {
    public static final String BASE_URL = "http://52.74.115.250:8080/";
    static public String loginUrlStr = BASE_URL +"auth/";

   static public String dealStr=BASE_URL+"api/";
    public static ApiInterface getSOService(String url)
    {
        return RetrofitClient.getClient(url).create(ApiInterface.class);

    }
}

这就是我在 MainActivity.java 中提出请求的方式:

myInterface.getOrder(token,"english").enqueue(new Callback<OrderList>() {

                        @Override
                        public void onResponse(Call<OrderList> call, Response<OrderList> response) {
                            if(response.isSuccessful())
                            {
                                Log.d("resultorder","RESULT IS "+response.body().getOrders().size());
                            }

                        }

                        @Override
                        public void onFailure(Call<OrderList> call, Throwable t) {

                        }
                    });

【问题讨论】:

  • 请在浏览器中发布此网址并发布您的 JSON
  • 如果你需要一步一步地按照这个-stackoverflow.com/questions/21398598/…
  • 使用更新的改造 2.0.2
  • @Adilhusen:当我在浏览器中粘贴 url 时,它给出了“未授权”..但是我在我的改造获取请求中添加了身份验证标头,其中授权值是我们成功登录后返回的令牌.
  • 好的,那么首先你需要检查邮递员,并在你的问题中发布你的 json 回复

标签: android retrofit2 gson


【解决方案1】:

我猜你的响应 json 不是完全格式化的 json。请检查你是否真的得到正确的输出

示例,额外配置

public Gson provideGson() {
        GsonBuilder builder = new GsonBuilder();
        builder.setLenient();
        builder.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> {
            if (json.getAsJsonPrimitive().isNumber()) {
                return new Date(json.getAsJsonPrimitive().getAsLong() * 1000);
            } else {
                return null;
            }
        });
        return builder.create();
    }

用作

retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create(provideGson())).build();

添加此依赖项以记录您所做的每个 http 请求/响应。有了这个,你就会知道你得到的响应是否正确

implement "com.squareup.okhttp3:logging-interceptor:${retrofitLoggingVersion}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2018-07-01
    • 2020-07-26
    • 2017-09-18
    相关资源
    最近更新 更多