改造2 - 获得200响应但不返回数据

mtr*_*ood 1 android retrofit2

TL; DR


新的改造,所以它可能是一个noob错误.端点在邮递员中工作正常,我得到Response{protocol=http/1.1, code=200, message=OK, url=http://192.168.1.249/api/v1/user/1}了响应,但没有与用户相关的数据.

问题


我使用Laravel构建了一个REST API,我想从设备访问它.将需要访问许多端点,但我无法使其中的任何端点工作.我想在添加其余部分之前让一个工作,但即使我得到200我没有得到数据.

所有属性都存在于response.body中,但它们都是null.

代码


MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;


import com.x.tools.actualrest.rest.User;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.ArrayList;
import java.util.List;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends Activity {

    private CdenApi cdenAPI;

    private String token;

    String requested_with = "XMLHttpRequest";
    String content_type = "application/json";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createCdenAPI();

        cdenAPI.getUser(requested_with, content_type, "1").enqueue(userCallback);


    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    private void createCdenAPI() {
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(CdenApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        cdenAPI = retrofit.create(CdenApi.class);
    }

    Callback<User> userCallback = new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful()) {
                User data = new User();
                data = response.body();
            } else {

            }
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
            t.printStackTrace();
        }
    };
} 
Run Code Online (Sandbox Code Playgroud)

CdenApi.java

import com.x.tools.actualrest.rest.User;

import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Path;
import retrofit2.Call;

public interface CdenApi {

    String BASE_URL = "http://192.168.1.249/api/v1/";

    @GET("user/{id}")
    Call<User> getUser(@Header("X-Requested-With") String req_with, @Header("Content-Type") String cont_type, @Path("id")String userId);

} 
Run Code Online (Sandbox Code Playgroud)

User.java

import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName("id")
    public Integer id;
    @SerializedName("name")
    public String name;
    @SerializedName("email")
    public String email;
    @SerializedName("access_level")
    public Integer accessLevel;
    @SerializedName("created_at")
    public String createdAt;
    @SerializedName("updated_at")
    public String updatedAt;
    @SerializedName("view_boxes")
    public ViewBoxes viewBoxes;

}
Run Code Online (Sandbox Code Playgroud)

UserResult.java

import com.google.gson.annotations.SerializedName;

public class UserResult {

    @SerializedName("msg")
    public String msg;
    @SerializedName("user")
    public User user;

}
Run Code Online (Sandbox Code Playgroud)

ViewBoxes.java

import com.google.gson.annotations.SerializedName;

public class ViewBoxes {

    @SerializedName("href")
    public String href;
    @SerializedName("method")
    public String method;

}
Run Code Online (Sandbox Code Playgroud)

端点的JSON:

{
    "msg": "User information",
    "user": {
        "id": 1,
        "name": "Guy",
        "email": "guy@ganker.com",
        "access_level": 1,
        "created_at": "2017-08-22 15:53:06",
        "updated_at": "2017-08-22 15:53:06",
        "view_boxes": {
            "href": "api/v1/user/1",
            "method": "GET"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案


我需要知道我哪里出错了.我是新来的改造,所以我确定我已经实现了一些错误,但我看不出问题.

在此先感谢您的帮助.

Cri*_*mez 5

我认为问题在于你有Call<User>,但至于你的json,你在服务器的响应中得到UserResult,所以相反它必须Call<UserResult>和userCallback相同,而不是

Callback<User> userCallback = new Callback<User>
Run Code Online (Sandbox Code Playgroud)

肯定是

Callback<UserResult> userCallback = new Callback<UserResult>
Run Code Online (Sandbox Code Playgroud)

在响应中也是如此

public void onResponse(Call<UserResult> call, Response<UserResult> response) {
            if (response.isSuccessful()) {
                User data = new User();
                data = response.body().user;
            } else {

            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 这看起来是正确的。因此,不幸的是,当Retrofit2无法将json转换为java时,它不发送任何形式的调试信息或日志消息。非常不幸。对于首次使用的用户来说,这是一个时间浪费,这与Retrofit2目标的相反结果 (2认同)