Reputation: 127
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
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