REST API调用总是onFailure

时间:2018-07-30 11:59:20

标签: android rest retrofit2

我是Android rest api的新手,基本上,我试图使用rest api与改造一起从演示网站检索一些信息。我的api总是以某种方式失败,希望有人可以提供帮助。

Api.class

String BASE_URL = "https://demo.openmrs.org/openmrs/ws/rest/v1/";
@GET("location?tag=Login%20Location")
Call<List<RetroLocation>> getLocation();

Location.class

@SerializedName("display")
@Expose
protected String display;

@Expose
private String name;

 public RetroLocation() {}

public RetroLocation(String display) {
    this.display = display;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

从主类调用api

private void retriveLocation() {
    //create object for the RetrofitInstance
    RestApi api = RetrofitInstance.getRetrofitInstance().create(RestApi.class);
    //making the call object using the api method created in the api class
    Call<List<RetroLocation>> call = api.getLocation();
    //making the call using enqueue(), it takes callback interface as an argument
    call.enqueue(new Callback<List<RetroLocation>>() {
        @Override
        public void onResponse(Call<List<RetroLocation>> call, Response<List<RetroLocation>> response) {
            progressDoalog.dismiss();
            if (response.body() != null) {
                //goes to my list
                List<RetroLocation> locationList = response.body();
                //creating an string array for the listview
                String[] location = new String[locationList.size()];
                //fill in the array with the response data from json
                for (int i = 0; i < locationList.size(); i++) {
                    location[i] = locationList.get(i).getName();
                }
                //displaying the string array into the listView
                ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.custom_row, R.id.location, location);
                listviewLocation.setAdapter(adapter);
                Log.d("result", "Respond");

                //generateDataList(response.body());
            }else
                Log.d("result", "No response");
        }

        @Override
        public void onFailure(Call<List<RetroLocation>> call, Throwable t) {
            //if(progressDoalog != null && progressDoalog.isShowing())
            //progressDoalog.dismiss();

            Toast.makeText(MainActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
            Log.d("result", "onFailuer");

        }
    });

RestInstance.class

public static Retrofit getRetrofitInstance() {
    if (retrofit == null) {
        retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(RestApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }
    if(retrofit!=null)
    Log.d("result", "logged in");

    return retrofit;
}

static OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
                Request request = original.newBuilder()
                        .header("Authorization", "Basic "+ getAuth())
                        .header("Accept", "application/json")
                        .method(original.method(),original.body())
                        .build();

                return chain.proceed(request);
            }
        }).build();

更新:这是可抛出的错误消息

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
        at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)

base_url的输出

   <org.openmrs.module.webservices.rest.SimpleObject serialization="custom">
<unserializable-parents/>
<map>
<default>
<loadFactor>0.75</loadFactor>
<threshold>12</threshold>
</default>
<int>16</int>
<int>3</int>
<string>uuid</string>
<string>b1a8b05e-3542-4037-bbd3-998ee9c40574</string>
<string>display</string>
<string>Inpatient Ward</string>
<string>links</string>
<list>
<org.openmrs.module.webservices.rest.web.Hyperlink>
<rel>self</rel>
<uri>
http://demo.openmrs.org/openmrs/ws/rest/v1/location/b1a8b05e-3542-4037-bbd3-998ee9c40574
</uri>
</org.openmrs.module.webservices.rest.web.Hyperlink>
</list>
</map>
<linked-hash-map>
<default>
<accessOrder>false</accessOrder>
</default>
</linked-hash-map>
</org.openmrs.module.webservices.rest.SimpleObject>
<org.openmrs.module.webservices.rest.SimpleObject serialization="custom">
<unserializable-parents/>
<map>
<default>
<loadFactor>0.75</loadFactor>
<threshold>12</threshold>
</default>
<int>16</int>
<int>3</int>
<string>uuid</string>
<string>2131aff8-2e2a-480a-b7ab-4ac53250262b</string>
<string>display</string>
<string>Isolation Ward</string>
<string>links</string>
<list>
<org.openmrs.module.webservices.rest.web.Hyperlink>
<rel>self</rel>
<uri>
http://demo.openmrs.org/openmrs/ws/rest/v1/location/2131aff8-2e2a-480a-b7ab-4ac53250262b
</uri>
</org.openmrs.module.webservices.rest.web.Hyperlink>
</list>
</map>
<linked-hash-map>
<default>
<accessOrder>false</accessOrder>
</default>
</linked-hash-map>
</org.openmrs.module.webservices.rest.SimpleObject>

2 个答案:

答案 0 :(得分:0)

这样的更改可能有效。

String BASE_URL = "https://demo.openmrs.org/";
@GET("openmrs/ws/rest/v1/location?tag=Login%20Location")
Call<List<RetroLocation>> getLocation();

答案 1 :(得分:0)

尝试

基本URL https://demo.openmrs.org/

改造界面

 @GET("openmrs/ws/rest/v1/location")
 Call<List<RetroLocation>> getLocation(@Query("tag") String tag);