pr Rost
pr Rost

Reputation: 127

get data from POST request

Im trying to get data from a POST request to build logic in my app.

For example; if code==200 start main Activity, else build error message.

But, when I'm trying to get this data from response value(parameter onResponse method) I have NPE, and in stack trace I see that response.body()=null.

In stack trace I also see that request is correct and get code==200,status=OK. From Postman I see that this request gets me data:

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

but I can't get it in my app :( API interface:

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:(Error in onResponse method when try to get i value)

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

            }
        });
}
}

SignInResult:

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

SignInResults:

public class SignInResults {
public SignInResult signInResult;

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

    List<SignInResult> signInResults;
}

Upvotes: 0

Views: 123

Answers (1)

Rafal
Rafal

Reputation: 302

As I can see you are using retrofit. Let's add some more log to retrofit response, request and see what's there.

If you are querying by browser client, browser can add some additional staff such as crftokens, some info from cookies but retrofit does not do that.

My example retrofit config. Note : it's for version 1.9.. but there should not be a lot of change in never one.

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

Upvotes: 1

Related Questions