Send Post Request with params using Retrofit
android retrofit post json example
retrofit post request with parameters
retrofit android post example
how to send form data using retrofit in android
how to post raw whole json in the body of a retrofit request?
retrofit android get example
retrofit gson
I'm trying unsuccessfully to consume an API on Android using Retrofit library but while using POSTMAN I can see the expected results.
POSTMAN SETTING
The api url (base+controller)
HTTP Method set to POST
Clicked the from-data or x-www-form-urlencoded
Then i pass the two params on the key/value fields.
ANDROID RETROFIT SETTING
@POST("/GetDetailWithMonthWithCode") void getLandingPageReport(@Query("code") String code, @Query("monthact") String monthact, Callback<LandingPageReport> cb); @FormUrlEncoded @POST("/GetDetailWithMonthWithCode") void getLandingPageReport(@Field("code") String code, @Field("monthact") String monthact, Callback<LandingPageReport> cb);
None of this options works. But am getting {} as result.
UPDATE
Same settings by using the standard HttpClient
(and HttpPost
) class works fine.
HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(url); List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); urlParameters.add(new BasicNameValuePair("code", "testcode")); urlParameters.add(new BasicNameValuePair("monthact", "feb-2015")); post.setEntity(new UrlEncodedFormEntity(urlParameters)); HttpResponse response = client.execute(post);
Why I can't do this request and get the correct response in Retrofit?
UPDATE 2
@POST("/GetDetailWithMonthWithCode") void getLandingPageReport(@Query("code") String code, @Query("monthact") String monthact, Callback<List<LandingPageReport>> cb); @FormUrlEncoded @POST("/GetDetailWithMonthWithCode") void getLandingPageReport(@Field("code") String code, @Field("monthact") String monthact, Callback<List<LandingPageReport>>> cb);
After playing around I think I've found the source of the problem. I've updated my retrofit code to receive List<LandingPageReport>
. But now this error occur
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
The reason is that i consume 2 api's (webapi and wcf). All my other json
response are arrays of objects. [{},{}] but in this call I've received this
{ "GetDetailWithMonthWithCodeResult": [ { "code": "test", "field1": "test", } ] }
But still I can't manage to parse the response.
build.gradle
compile 'com.google.code.gson:gson:2.6.2' compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion
Login APi Put Two Parameters
{ "UserId": "1234", "Password":"1234" }
Login Response
{ "UserId": "1234", "FirstName": "Keshav", "LastName": "Gera", "ProfilePicture": "312.113.221.1/GEOMVCAPI/Files/1.500534651736E12p.jpg" }
APIClient.java
import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; class APIClient { public static final String BASE_URL = "Your Base Url "; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } }
APIInterface interface
interface APIInterface { @POST("LoginController/Login") Call<LoginResponse> createUser(@Body LoginResponse login); }
Login Pojo
package pojos; import com.google.gson.annotations.SerializedName; public class LoginResponse { @SerializedName("UserId") public String UserId; @SerializedName("FirstName") public String FirstName; @SerializedName("LastName") public String LastName; @SerializedName("ProfilePicture") public String ProfilePicture; @SerializedName("Password") public String Password; @SerializedName("ResponseCode") public String ResponseCode; @SerializedName("ResponseMessage") public String ResponseMessage; public LoginResponse(String UserId, String Password) { this.UserId = UserId; this.Password = Password; } public String getUserId() { return UserId; } public String getFirstName() { return FirstName; } public String getLastName() { return LastName; } public String getProfilePicture() { return ProfilePicture; } public String getResponseCode() { return ResponseCode; } public String getResponseMessage() { return ResponseMessage; } }
MainActivity
package com.keshav.retrofitloginexampleworkingkeshav; import android.app.Dialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import pojos.LoginResponse; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import utilites.CommonMethod; public class MainActivity extends AppCompatActivity { TextView responseText; APIInterface apiInterface; Button loginSub; EditText et_Email; EditText et_Pass; private Dialog mDialog; String userId; String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); apiInterface = APIClient.getClient().create(APIInterface.class); loginSub = (Button) findViewById(R.id.loginSub); et_Email = (EditText) findViewById(R.id.edtEmail); et_Pass = (EditText) findViewById(R.id.edtPass); loginSub.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (checkValidation()) { if (CommonMethod.isNetworkAvailable(MainActivity.this)) loginRetrofit2Api(userId, password); else CommonMethod.showAlert("Internet Connectivity Failure", MainActivity.this); } } }); } private void loginRetrofit2Api(String userId, String password) { final LoginResponse login = new LoginResponse(userId, password); Call<LoginResponse> call1 = apiInterface.createUser(login); call1.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { LoginResponse loginResponse = response.body(); Log.e("keshav", "loginResponse 1 --> " + loginResponse); if (loginResponse != null) { Log.e("keshav", "getUserId --> " + loginResponse.getUserId()); Log.e("keshav", "getFirstName --> " + loginResponse.getFirstName()); Log.e("keshav", "getLastName --> " + loginResponse.getLastName()); Log.e("keshav", "getProfilePicture --> " + loginResponse.getProfilePicture()); String responseCode = loginResponse.getResponseCode(); Log.e("keshav", "getResponseCode --> " + loginResponse.getResponseCode()); Log.e("keshav", "getResponseMessage --> " + loginResponse.getResponseMessage()); if (responseCode != null && responseCode.equals("404")) { Toast.makeText(MainActivity.this, "Invalid Login Details \n Please try again", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Welcome " + loginResponse.getFirstName(), Toast.LENGTH_SHORT).show(); } } } @Override public void onFailure(Call<LoginResponse> call, Throwable t) { Toast.makeText(getApplicationContext(), "onFailure called ", Toast.LENGTH_SHORT).show(); call.cancel(); } }); } public boolean checkValidation() { userId = et_Email.getText().toString(); password = et_Pass.getText().toString(); Log.e("Keshav", "userId is -> " + userId); Log.e("Keshav", "password is -> " + password); if (et_Email.getText().toString().trim().equals("")) { CommonMethod.showAlert("UserId Cannot be left blank", MainActivity.this); return false; } else if (et_Pass.getText().toString().trim().equals("")) { CommonMethod.showAlert("password Cannot be left blank", MainActivity.this); return false; } return true; } }
CommonMethod.java
public class CommonMethod { public static final String DISPLAY_MESSAGE_ACTION = "com.codecube.broking.gcm"; public static final String EXTRA_MESSAGE = "message"; public static boolean isNetworkAvailable(Context ctx) { ConnectivityManager connectivityManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } public static void showAlert(String message, Activity context) { final AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(message).setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); try { builder.show(); } catch (Exception e) { e.printStackTrace(); } } }
activity_main.xml
<LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/imgLogin" android:layout_width="200dp" android:layout_height="150dp" android:layout_gravity="center" android:layout_marginTop="20dp" android:padding="5dp" android:background="@mipmap/ic_launcher_round" /> <TextView android:id="@+id/txtLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/imgLogin" android:layout_centerHorizontal="true" android:text="Holostik Track and Trace" android:textSize="20dp" android:visibility="gone" /> <android.support.design.widget.TextInputLayout android:id="@+id/textInputLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/box_layout_margin_left" android:layout_marginRight="@dimen/box_layout_margin_right" android:layout_marginTop="8dp" android:padding="@dimen/text_input_padding"> <EditText android:id="@+id/edtEmail" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ems="10" android:fontFamily="sans-serif" android:gravity="top" android:hint="Login ID" android:maxLines="10" android:paddingLeft="@dimen/edit_input_padding" android:paddingRight="@dimen/edit_input_padding" android:paddingTop="@dimen/edit_input_padding" android:singleLine="true"></EditText> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:id="@+id/textInputLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/textInputLayout1" android:layout_marginLeft="@dimen/box_layout_margin_left" android:layout_marginRight="@dimen/box_layout_margin_right" android:padding="@dimen/text_input_padding"> <EditText android:id="@+id/edtPass" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:fontFamily="sans-serif" android:hint="Password" android:inputType="textPassword" android:singleLine="true" /> </android.support.design.widget.TextInputLayout> <RelativeLayout android:id="@+id/rel12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textInputLayout2" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" > <Button android:id="@+id/loginSub" android:layout_width="wrap_content" android:layout_height="45dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/border_button" android:paddingLeft="30dp" android:paddingRight="30dp" android:layout_marginRight="10dp" android:text="Login" android:textColor="#ffffff" /> </RelativeLayout> </LinearLayout>
Retrofit Android Example : Sending HTTP GET, POST Request, Retrofit is a type-safe HTTP client for Android and Java. on a service method parameter instead of specifying a form-style request body with a Now comes the important part- sending an HTTP GET request with Retrofit and displaying the response. Our UI will contain just one EditText and one Button. We will simply enter the city name in EditText and click the button. Clicking it will invoke a network request to fetch the weather details for that city.
This is a simple solution where we do not need to use JSON
public interface RegisterAPI { @FormUrlEncoded @POST("/RetrofitExample/insert.php") public void insertUser( @Field("name") String name, @Field("username") String username, @Field("password") String password, @Field("email") String email, Callback<Response> callback); }
method to send data
private void insertUser(){ //Here we will handle the http request to insert user to mysql db //Creating a RestAdapter RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(ROOT_URL) //Setting the Root URL .build(); //Finally building the adapter //Creating object for our interface RegisterAPI api = adapter.create(RegisterAPI.class); //Defining the method insertuser of our interface api.insertUser( //Passing the values by getting it from editTexts editTextName.getText().toString(), editTextUsername.getText().toString(), editTextPassword.getText().toString(), editTextEmail.getText().toString(), //Creating an anonymous callback new Callback<Response>() { @Override public void success(Response result, Response response) { //On success we will read the server's output using bufferedreader //Creating a bufferedreader object BufferedReader reader = null; //An string to store output from the server String output = ""; try { //Initializing buffered reader reader = new BufferedReader(new InputStreamReader(result.getBody().in())); //Reading the output in the string output = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } //Displaying the output as a toast Toast.makeText(MainActivity.this, output, Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { //If any error occured displaying the error as toast Toast.makeText(MainActivity.this, error.toString(),Toast.LENGTH_LONG).show(); } } ); }
Now we can get the post request using php aur any other server side scripting.
Source Android Retrofit Tutorial
Sending Data With Retrofit 2 HTTP Client for Android, A type-safe HTTP client for Android and Java. URL parameter replacement and query parameter support; Object conversion to request body (e.g., JSON, Send request parameters with Retrofit. You can easily send parameters to a web service. The service you see in this example lets you pass in query strings with named parameters. In particular, you can filter by category. With Retrofit, you can create a new call that once again uses a GET request.
I have found the solution. The issue was a problem in my classes structure. So i updated them like the following samples.
public class LandingPageReport { private ArrayList<LandingPageReportItem> GetDetailWithMonthWithCodeResult; // + Getter Setter methods } public class LandingPageReportItem { private String code; private String field1; // + Getter Setter methods }
And then i use this retrofit configuration
@POST("/GetDetailWithMonthWithCode") void getLandingPageReport(@Field("code") String code, @Field("monthact") String monthact, Callback<LandingPageReport> cb);
Retrofit, In this Retrofit Tutorial we will be doing an HTTP POST request by annotating the method with @POST and including the argument @Body am trying unsuccessfully to consume an API on Android but while using POSTMAN i can see the expected results. [POSTMAN SETTING] The api url (base+controller) HTTP Method set to POST. Clicked the from-data or x-www-form-urlencoded. Then i pass the two params on the key/value fields.
You should create an interface for that like it is working well
public interface Service { @FormUrlEncoded @POST("v1/EmergencyRequirement.php/?op=addPatient") Call<Result> addPerson(@Field("BloodGroup") String bloodgroup, @Field("Address") String Address, @Field("City") String city, @Field("ContactNumber") String contactnumber, @Field("PatientName") String name, @Field("Time") String Time, @Field("DonatedBy") String donar); }
or you can visit to http://teachmeandroidhub.blogspot.com/2018/08/post-data-using-retrofit-in-android.html
and youcan vist to https://github.com/rajkumu12/GetandPostUsingRatrofit
Retrofit Tutorial in Android – Part 2 POST Requests, You will learn to make http call using retrofit post request with parameters in this registration, near by place etc. request need to have parameter with the URL. Send Objects as Request Body. Retrofit offers the ability to pass objects within the request body. Objects can be specified for use as HTTP request body by using the @Body annotation. The functionality of Retrofit’s @Body annotation hasn’t changed in version 2.
The good way in my opinion is to send it in the POST Body
this means you'll have a create a new POJO but some might like this implementation the most.
public interface APIInterface { @POST("/GetDetailWithMonthWithCode") List<LandingPageReport> getLandingPageReport(@Body Report report); }
Then make your POJO with a constructor, getters and setters.
public static class Report { private String code; private String monthact; public Report(String code, String monthact) { this.code = code; this.monthact = monthact; } // Getters and Setters... }
And just call it the normal way.
Call<List<Report>> request = apiInterface .createRetrofitAPIInterface() .getLandingPageReport(new Report(code, monthact));
How to send POST request using Retrofit 2?, Retrofit Android Example with Get and Post Api Request. are going to use to execute HTTP requests such as GET, POST, PUT, DELETE. @Query, specifies the query key name with the value of the annotated parameter. Retrofit skips null parameters and ignores them while assembling the request. Keep in mind, that you can’t pass null for primitive data types like int , float , long , etc. Instead, use Integer , Float , Long , etc and the compiler won’t be grumpy.
Android Retrofit Post Request With Parameters JSON Example, Change method parameter to @Body Map<String, String> versionId . The @Body annotation converts (serializes) Map (HashMap) data into Note the encoded=true is necessary, otherwise retrofit will encode the comma in the string parameter. Usage: Usage: String latlng = location.getLatitude() + "," + location.getLongitude(); service.getLocation(latlng);
Retrofit Android Example with Get and Post Api Request., I found that when you use a compound object as @Body params, it could not work well with the Retrofit's GSONConverter (under the assumption you are using that). You have to use JsonObject and not JSONObject when working with that, it adds NameValueParams without being verbose about it - you can only see that if you add another dependency of logging interceptor, and other shenanigans.
Send post request with params · Issue #840 · square/retrofit · GitHub, Sending Data With Retrofit 2 HTTP Client for Android We can also use the @Body annotation on a service method parameter whose job is to execute a POST request
Comments
GetDetailWithMonth&Code
this part is probably invalid- what you mean with that ? how can i do that working? on iOS works and what i do is i convert to NSDATA this string "par1=adads&par2=asd" and put it to the request.
- symbol
&
acts like a separator for request params, so you should rename your API method(inside your API) to something likeGetDetailWithMonthAndCode
- I have update the post. Sr it was just a mistake when i was writing the post here.
- Mistake is probably in your API. Also, you should be using
GET
http method for getting data, instead ofPOST
. - Who got confuse about dimen in layout.. stackoverflow.com/questions/28005048/…
- some update for conectifity.. stackoverflow.com/questions/32547006/…
- just copy from the source comment,, cz i got saame problem,,
RestAdapter doesnt get resolved please help me out
..