【问题标题】:get data from POST request从 POST 请求中获取数据
【发布时间】:2016-04-26 19:43:29
【问题描述】:

我正在尝试从 POST 请求中获取数据以在我的应用中构建逻辑。

例如; if code==200 start main Activity, else build error message.

但是,当我尝试从响应值(参数 onResponse 方法)获取此数据时,我有 NPE,并且在堆栈跟踪中我看到 response.body()=null。

在堆栈跟踪中,我还看到请求是正确的并得到代码==200,状态=确定。 从 Postman 那里我看到这个请求获取了我的数据:

{
    "status": true,
    "auth": {
        "token": "f1071c34857e456b8ceb996de3459ab3",
        "expires": "2017-04-26 10:01:21",
        "user_id": "11272862"
    },
    "user": {
        "user_id": "11272862",
        "username": "prozrostyslav",
        "full_url": "https://vid.me/prozrostyslav",
        "avatar": null,
        "avatar_url": "https://d2ha22j8ys3e0o.cloudfront.net/images/default-avatars/13.png?602-2-2-4-9",
        "cover": null,
        "cover_url": "https://d2ha22j8ys3e0o.cloudfront.net/images/default-covers/03.jpg?602-2-2-4-9",
        "displayname": null,
        "follower_count": 0,
        "likes_count": "0",
        "video_count": 0,
        "video_views": "0",
        "videos_scores": 0,
        "comments_scores": 0,
        "bio": null
    }
}

但我无法在我的应用程序中获取它:( API 接口:

public interface VideoApi {

    @GET("/videos/featured")
    Call<Videos> getFeaturedVideo();

    @GET("/videos/new")
    Call<Videos> getNewVideo();

@Headers("Content-Type:application/x-www-form-urlencoded")
    @FormUrlEncoded
    @POST("/auth/create")
   Call<SignInResults>insertUser(@Header("Authorization") String authorization,@Field("username") String username,
                           @Field("password") String password
                           );
}

Fragment:(尝试获取 i 值时 onResponse 方法出错)

public class FeedFragment extends Fragment {
    EditText username;
    EditText password;
    Button btnLogin;

    public List<SignInResult> signInResult;
    String username_value,password_value;
    public static final String ROOT_URL = "https://api.vid.me/";

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_feed, container, false);
        username = (EditText) rootView.findViewById(R.id.user_name_field);
        password = (EditText) rootView.findViewById(R.id.password_field);
        btnLogin = (Button) rootView.findViewById(R.id.button_login);
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Authorize();
            }
        });
        return rootView;
    }

    public void Authorize() {
        Retrofit retrofitAdapter = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(ROOT_URL)
                .build();
        final VideoApi videoApi = retrofitAdapter.create(VideoApi.class);

         username_value = username.getText().toString();
         password_value = password.getText().toString();
String basicauth = "Basic "+ Base64.encodeToString(String.format("%s:%s",username_value,password_value).getBytes(),Base64.NO_WRAP);
        Call<SignInResults> call = videoApi.insertUser(basicauth,username_value,password_value);
        call.enqueue(new Callback<SignInResults>() {


            @Override
            public void onResponse(Call<SignInResults> call, Response<SignInResults> response) {
                 String i = response.body().signInResult.getUser_id();
            Log.d("Response ==>> ", i);

            }

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

            }
        });
}
}

登录结果:

public class SignInResult {


    @SerializedName("authorization")
    @Expose
    private String authorization;
    @SerializedName("code")
    @Expose
    private String code;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @SerializedName("username")
    @Expose
    private String username;

    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    @SerializedName("user_id")
    @Expose
    private String user_id;
}

登录结果:

public class SignInResults {
public SignInResult signInResult;

    public List<SignInResult> getSignInResults() {
        return signInResults;
    }

    List<SignInResult> signInResults;
}

【问题讨论】:

    标签: android retrofit retrofit2


    【解决方案1】:

    我可以看到您正在使用改造。让我们添加更多日志来改造响应、请求并查看其中的内容。

    如果您是通过浏览器客户端查询,浏览器可以添加一些额外的人员 例如 crftokens,来自 cookie 的一些信息,但改造不会这样做。

    我的示例改造配置。注意:它适用于 1.9 版.. 但绝不应该有太多变化。

            mRestAdapter = new RestAdapter.Builder()
                .setEndpoint(SERVER_URL)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setConverter(gsonConverter)
                .setLog(new RestAdapter.Log() {
                    @Override
                    public void log(String message) {
                        Log.d("Retrofit", message);
                    }
                })
    

    【讨论】:

      猜你喜欢
      • 2019-11-26
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多