使用POST进行改造

时间:2015-07-22 08:55:48

标签: android retrofit

这是我的Api界面:

public interface Api {

    @FormUrlEncoded
    @POST("/")
    public void feed(@Field("tag") String tag,
                      @Field("id") int id,
                      Callback<String> respone);


}

这是我在MainActivity中调用的方法:|

public static void setBody(int i) {
    final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint(WELCOM_URL).build();
    Api vocApi = restadapter.create(Api.class);
    vocApi.feed("get_about", 11, new Callback<String>() {


        @Override
        public void success(String obj, Response response) {
            Log.d("Great", obj.toString());

        }

        @Override
        public void failure(RetrofitError error) {
            //Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
            Log.e("Errrorrr..", error.toString());
        }

    });
}

如果正确,它将返回一个JSon Object字符串。 我的问题是我收到了这条消息:

retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

那么,我的代码有什么问题吗? 感谢

2 个答案:

答案 0 :(得分:0)

对于一个完美的解决方案,我需要更多的细节,比如从你的api返回json,但根据你的错误日志,改装从api获取json对象,你试图把它作为一个字符串。

我修改了你的代码:

public static void setBody(int i) {
    final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint(WELCOM_URL).build();
    Api vocApi = restadapter.create(Api.class);
    vocApi.feed("get_about", 11, new Callback<JSONObject>() {


        @Override
        public void success(JSONObject obj, Response response) {
            Log.d("Great", obj.toString());

        }

        @Override
        public void failure(RetrofitError error) {
            //Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
            Log.e("Errrorrr..", error.toString());
        }

    });
}

对于改造的结果,您必须创建与您的api中的返回json对象匹配的POJOS并将其提供给Retrofit Callback,如

new Callaback<YourResponseBean>();

答案 1 :(得分:0)

我找到了解决方案:

我们必须为Callback对象创建新的POJO。我们不能将它直接用作字符串响应或任何Json对象。 这里是Api接口的代码:

@FormUrlEncoded
@POST("/")
public void feed(@Field("tag") String tag,
                  @Field("id") int id,
                  Callback<Profile> respone);

班级简介:

public class Profile {
    @SerializedName("latitude")
    public double latitude;
    @SerializedName("longitude")
    public double longitude;
    @SerializedName("error")
    public boolean error;
    ---
    Constructor
    Getter and Setter
    ----

}

叫方法:

public static void setBody(int i) {
    final RestAdapter restadapter = new RestAdapter.Builder().setEndpoint(WELCOM_URL).build();
    Api vocApi = restadapter.create(Api.class);
    vocApi.feed("get_about", i, new Callback<Profile>() {
        @Override
        public void success(Profile obj, Response response) {
            Log.d("sadf", obj.isError() +"-"+obj.getLatitude()+ "-" + obj.getLongitude());
        }
    @Override
    public void failure(RetrofitError error) {
        Log.e("1Errrorrr..", error.toString());
    }
});

}