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

时间:2017-09-04 17:14:43

标签: 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();
        }
    };
} 

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);

} 

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;

}

UserResult.java

import com.google.gson.annotations.SerializedName;

public class UserResult {

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

}

ViewBoxes.java

import com.google.gson.annotations.SerializedName;

public class ViewBoxes {

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

}

来自端点的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"
        }
    }
}

解决方案

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

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:5)

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

Callback<User> userCallback = new Callback<User>

一定是

Callback<UserResult> userCallback = new Callback<UserResult>

和响应中的相同

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

            }
        }

答案 1 :(得分:1)

尝试这样做

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

    createCdenAPI();
    Response<User> response = cdenAPI.getUser(requested_with, content_type, "1").execute();

    User user = response.body();
 }

答案 2 :(得分:0)

在您的MainActivity.java

删除

User data = new User();
data = response.body();

并替换为

User data = response.body();

答案 3 :(得分:0)

关于模型类,您可以尝试将相同的模型类用于 网络,视图和数据库访问,但是每个都有一些怪癖,因此最好有一个通用模型类,以便可以将数据库模型和网络模型相互转换。

关于房间和装修。房间似乎不喜欢孩子的名单,如果改型得到200(成功)错误代码但没有数据,则可能是问题 转换过程失败了,改造不会给您任何信息。

尝试直接从json重新生成netwotrk模型类,并使用它们。 Android Studio插件JsonToKotlinClass来创建数据类ALT-K或右键单击 包->新建-> JSON中的Kotlin数据类

答案 4 :(得分:-1)

seq_along(levels(df$gender))
#[1] 1 2

答案 5 :(得分:-2)



response.body().string();

//you get this 

  {
    "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"
        }
    }


//instead of this
 
Response{protocol=http/1.1,
 code=200, 
message=OK, 
url=http://192.168.1.249/api/v1/user/1}