Hello i using Post method in retrofit . I have one Activity ProfileActivity and I try to update ProfileActivity. When i try to update my Activity it response like :-
"name": "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"JohndoeOperator\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"",
I try to remove this extra "\"\" from my String ,But question is why
this add when i try to update my profile
Here is my code:-
APIInterface.java
#Multipart
#POST("updateProfile")
Call<UpdateProfileUserSideResponse> updateProfile(#Part("userId") int userId,
#Part("name") String name,
#Part("companyName") String companyName,
#Part("gstin") String gstin,
#Part("address") String address,
#Part("landmark") String landmark,
#Part("city") String city,
#Part("state") String state,
#Part("pincode") String pincode,
#Part MultipartBody.Part image);
and Here is my API call :-
final ApiInterface api = ApiClient.getApiService();
Call<UpdateProfileUserSideResponse> call = api.updateProfile(preferenceManager.getUserId(), edt_user_FullName.getText().toString(), "", "", edt_user_address.getText().toString(), edt_user_landMark.getText().toString(), edt_user_city.getText().toString(), edt_user_state.getText().toString(), edt_user_pincode.getText().toString(), fileToUpload);
call.enqueue(new Callback<UpdateProfileUserSideResponse>() {
#Override
public void onResponse(Call<UpdateProfileUserSideResponse> call, Response<UpdateProfileUserSideResponse> response) {
Toast.makeText(getContext(), "" + response.message(), Toast.LENGTH_SHORT).show();
preferenceManager.setName(response.body().getData().getName());
Log.e("AHHHHHHAHAAA", "" + response.body().getData().getName());
preferenceManager.setAddress(response.body().getData().getAddress());
preferenceManager.setLandmark(response.body().getData().getLandmark());
preferenceManager.setCity(response.body().getData().getCity());
preferenceManager.setState(response.body().getData().getState());
preferenceManager.setPincode(response.body().getData().getPincode());
preferenceManager.setImage(response.body().getData().getImage());
progressDialog.dismiss();
}
#Override
public void onFailure(Call<UpdateProfileUserSideResponse> call, Throwable t) {
Toast.makeText(getContext(), t.getMessage(), Toast.LENGTH_LONG).show();
progressDialog.dismiss();
}
});
First, check your API on postman plugin of chrome browser
Is gives the same result on postman as well.
Related
//url to consume - baseURL/xyz/test-map.php?key=3ec9864e9db5fb47da338d108503d4612fc65b80
#FormUrlEncoded
#POST("xyz/test-map.php")
Call<Root> getResponseForApi (#Field(value = "key", encoded = true) String key ,
#Field("auth_key") int auth_key,
#Field("password") int password) ;
when i try to call ,
Call<Root> call = apiServiceImplementation.getResponseForApi(key, auth_key, password);
call.enqueue(new Callback<Root>() {
#Override
public void onResponse(Call<Root> call, Response<Root> response) {
Root data = response.body();
}
#Override
public void onFailure(Call<Root> call, Throwable t) {
Log.e("TAG", "onFailure: " );
}
});
i am getting URL in on response as without query parameter like "baseURL/xyz/test-map.php" only.
why it is not encoding
you can use both #Query and #Field in your request.
here is your solution.
#FormUrlEncoded
#POST("xyz/test-map.php")
Call<Root> getResponseForApi (#Query("key") String key ,
#Field("auth_key") int auth_key,
#Field("password") int password) ;
i'm new to android and using retrofit for the first time.
i've implemented all the things but retrofit is giving null values of responses.
this is my sample request:
http://192.168.1.0/demo/kdemo//webservice/api.php?query=user.auttentication&user_name=admin&password=admin
for this I'm taking base url as :
BASE_URL="http://192.168.1.0/demo/kdemo//webservice/"
and End point in interface as :
#GET("api.php")
Call<UserAuthenticaiton> getUserAuthentication(#Query("user.auttentication")
String userAuttentication,
#Query("user_name") String
user_name,
#Query("password") String
password);
JSon viewer is giving values but retrofit is not..
This is Api call:
ApiInterface apiService= ApiClient.getClient().create(ApiInterface.class);
Call<UserAuthenticaiton> call=apiService.getUserAuthentication("user.auttentication","admin","admin");
call.enqueue(new Callback<UserAuthenticaiton>() {
#Override
public void onResponse(Call<UserAuthenticaiton> call, Response<UserAuthenticaiton> response) {
String id=response.body().getId();
String error=response.body().getError();
Toast.makeText(LoginActivity.this, "Id: "+id+" Error: "+error, Toast.LENGTH_SHORT).show();
Intent intentNew=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intentNew);
}
#Override
public void onFailure(Call<UserAuthenticaiton> call, Throwable t) {
Toast.makeText(LoginActivity.this, "Failed to load", Toast.LENGTH_SHORT).show();
}
});
All request method is working fine, but PUT request method is never successful. Its working perfectly in 'Postman' with same parameters. My request calling interface
#Multipart
#PUT("api/v1/user/{id}/")
Call<UpdateProfileResponse> updateUserProfile(
#Header("Authorization") String token,
#Path("id") int user_id,
#Part("name") RequestBody name,
#Part("email") RequestBody email,
#Part("password") RequestBody password,
#Part MultipartBody.Part picture,
#Part("city") RequestBody city,
#Part("country") RequestBody country,
#Part("bank_name") RequestBody bank_name,
#Part("bank_account_name") RequestBody bank_account_name,
#Part("bank_account_number") RequestBody bank_account_number,
#Part("user_type") RequestBody user_type,
#Part("address") RequestBody address
);
Request calling (enqueuing)
mApiClient.updateUserProfile(access_token, user_id, name, email, password, bodyPicture, city,
country, bank_name, bank_account_name, bank_account_number, user_type, address)
.enqueue(new Callback<UpdateProfileResponse>() {
#Override
public void onResponse(Call<UpdateProfileResponse> call, Response<UpdateProfileResponse> response) {
if (response.isSuccessful()) {
Log.d(TAG, "update response: " + response.body().toString());
} else {
Log.d(TAG, "update response: " + response.errorBody());
}
}
#Override
public void onFailure(Call<UpdateProfileResponse> call, Throwable t) {
t.printStackTrace();
}
});
its always finishes in OnResponse else block (not successful). Not getting any clue what I am doing wrong. Need suggestion to fix this.
i want to send string from app to server with retrofit 2, and get back return values. what is the problem?
but it doesn't work.
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RatingApiService retrofitService=retrofit.create(RatingApiService.class);
Call<String> call = retrofitService.registration("saeed","ali");
call.enqueue(new Callback<String>() {
#Override
public void onResponse(Call<String> call, Response<String> response) {
if(response!=null){
Log.i("upload","is success:" +response.body());
}else{
Log.i("upload","response is null");
}
}
#Override
public void onFailure(Call<String> call, Throwable t) {
Log.i("upload","onFailure: "+t.getMessage());
}
});
Interface:
public interface RatingApiService {
#FormUrlEncoded
#POST("android/add2/{email}{password}")
Call<String> registration(#Path("email") String email, #Path("password") String password);
}
Instead of using parameters to pass your data; put it in a req.body, then send it. By doing so, you can bypass the URL string limit and the code is much more organized.
public interface RatingApiService {
#Headers("Content-Type: application/json") //Must be set to application/json so req.body can be read.
#POST("android")
Call<String> registration(#Body UserRegistrationRequest body);
}
Now, you might ask what is the " UserRegistrationRequest" class? that will be the object class that will be sent as a JSON object. We define it by:
public class UserRegistrationRequest {
final String email;
final String password;
UserRegistrationRequest(String email, String password){
this.email = email;
this.password = password;
}
}
And then the final step. This is how you convert the object to a JSON object and send it to your server.
UserRegistrationRequest userRegistrationRequest = new UserRegistrationRequest(
RegisterNameFragment.sFirstName, RegisterNameFragment.sLastName, RegisterEmailFragment.sEmail,
RegisterPasswordFragment.sPassword, RegisterAgeFragment.sAge);
Call<Void> call = retrofit.insertUserRegistration(userRegistrationRequest);
call.enqueue(new Callback<UserRegistration>() {
#Override
public void onResponse(Call<UserRegistration> call, Response<UserRegistration> response) {
Log.d("blue", "Data is sent");
}
#Override
public void onFailure(Call<UserRegistration> call, Throwable t) {
Log.d("blue", "fail");
}
});
You need to add #Body annotation to your method like below.
#POST("users/new")
Call<User> createUser(#Body User user);
The content of #Body is sent to server as request body.
If you want to send email and password to server, you should create object that contains such data and use the object in the #Body annotation.
I am trying to implement a POST request via Retrofit, but the approach seems to be wrong, I guess. I followed the steps I used for GET request:
I defined the end point:
public interface GitHubEmailAPI {
#POST("/users/{user}")
Call<GitHubEmail> postEmail(#Field("email") String email);
}
The model:
public class GitHubEmail {
#SerializedName("email")
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
And the calling:
public void postEmail (){
GitHubEmailAPI apiService =
ApiClient.getClient().create(GitHubEmailAPI.class);
final Call<GitHubEmail> callEmail = apiService.postEmail
(String.valueOf(enterEmailEt.getText()));
callEmail.enqueue(new Callback<GitHubEmail>() {
#Override
public void onResponse(Call<GitHubEmail> call, Response<GitHubEmail> response) {
testTV.setText(callEmail.toString());
}
#Override
public void onFailure(Call<GitHubEmail> call, Throwable t) {
Log.e("Email", t.toString());
}
});
I am using the github api as a test, not sure if the access token needs to be included as a parameter in the request.
There are some info which you know about Retrofit ....
Your BASE_URL must be end with / .
When you using #Field notation you must put #FormUrlEncoded in Your Api call.
When you using {user} in the API method you have to use #Path("user") String user to relate to url data .
Your POST method URL will be like this #POST("users/{user}").
When your response Callback done the actual Data inside your Response<GitHubEmail> response in this variable. You have to use response.body() to get what you get response from API CALL.
Here is a sample code
#FormUrlEncoded
#POST("users/{user}")
Call<YourResultPojoClassHere> yourFuntionName(#Field("id") String id,#Path("user") String path);
please take look on below code ....
callEmail.enqueue(new Callback<GitHubEmail>() {
#Override
public void onResponse(Call<GitHubEmail> call, Response<GitHubEmail> response) {
if (response.isSuccessful()) {
if (response.body().getSuccess())
Toast.makeText(ClassName.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
else
Toast.makeText(ClassName.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
} else
Toast.makeText(ClassName.this, "Sorry for inconvince server is down", Toast.LENGTH_SHORT).show();
}
#Override
public void onFailure(Call<GitHubEmail> call, Throwable t) {
Toast.makeText(ClassName.this, "Check your Internet connection", Toast.LENGTH_SHORT).show();
}
}
});
For POST in retrofit you must include #FormUrlEncoded
#FormUrlEncoded
#POST("path_here")
Call<ResponseBody> function_name(#Field("data") String data);