0

I am struggling in finding a replacement for the deprecated DefaultHttpClient and connected classes liken HttpPost etc.

In a first attempt, I tried using the volley library, but nothing seemed to work, so after a bit research I am trying now with Retrofit 1.9.

In my app, I connect to a own restful client. Here is the old code (example POST), which works perfectly well:

    private static DefaultHttpClient httpClient = new DefaultHttpClient();

    public static String executePOST(Map<String, String> postParams, int connTO, int sockTO, String uri){

        String res, message;
        HttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, connTO);
        HttpConnectionParams.setSoTimeout(httpParams, sockTO);
        HttpConnectionParams.setTcpNoDelay(httpParams, true);

        httpClient.setParams(httpParams);

        HttpPost httppost = new HttpPost(uri);
        JSONObject json = new JSONObject();

        try {
            Iterator<Entry<String, String>> iterator = postParams.entrySet().iterator();

            while(iterator.hasNext()){
                Map.Entry<String, String> pair = (Map.Entry<String, String>)iterator.next();
                json.put(pair.getKey(), pair.getValue());
            }

            message = json.toString();

            httppost.setEntity(new StringEntity(message, "UTF8"));
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Content-type", "application/json");

            HttpResponse response = httpClient.execute(httppost);
            HttpEntity entity = response.getEntity();           
            res = EntityUtils.toString(entity).trim();

        } catch (ClientProtocolException e) {
            res = "Client Protocol Exception";
        } catch (IOException e) {
            res = e.getLocalizedMessage();
        } catch (JSONException e){
            res = e.getLocalizedMessage();
        }

        return res;
    }

I send the request like this from my Activity

Map<String, String> arguments = new HashMap<String, String>();
        arguments.put("email", username);
new HttpClient(arguments, new LoginActivityCommunicationListener(this, LoginOperation.EMAIL_CHECK), URI_ROOT + "/kunde", 0).execute();

The listener in the arguments handles the response callback, the 0 means POST.

this results in a JSON response, having the fields id and person

So I tried to implement a Retrofit variant of above like this

MyApi.java

public interface MyDosAPI {

    @FormUrlEncoded
    @POST("/kunde")
    public void checkEmail(@Field("email") String email, Callback<EmailCheck> response);
}

EmailCheck.java

public class EmailCheck {

    @SerializedName("id")
    private String id;

    @SerializedName("person")
    private String person;

    public void setId(String id){
        this.id = id;
    }

    public void setPerson(String person){
        this.person = person;
    }

    public String getId(){
        return id;
    }

    public String getPerson(){
        return person;
    }
}

and in the activity

RestAdapter adapter = new RestAdapter.Builder()
                .setEndpoint(URI_ROOT)
                .build();

        MyDosAPI api = adapter.create(MyDosAPI.class);

        api.checkEmail(username, new Callback<EmailCheck>() {
            @Override
            public void success(EmailCheck emailChecks, Response response) {
                Log.i("MyCount", "success");
            }

            @Override
            public void failure(RetrofitError error) {
                Log.i("MyCount", error.getMessage());
            }
        });

result

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

obviously there is something essential that I am missing. Is there - apart of Retrofit or Volley - another solution where I can define the requests like I did before?

Valentino Ru
  • 4,964
  • 12
  • 43
  • 78
  • 1
    You are declaring that your request is `@FormUrlEncoded`, but that is not what your original code does. It does not submit a form; it posts a JSON payload. "Is there - apart of Retrofit or Volley - another solution where I can define the requests like I did before?" -- use Apache's packaging of HttpClient. Or, use `HttpUrlConnection`. Or, use OkHttp. Or, use AndroidAsync. See https://stackoverflow.com/questions/32949626/android-m-org-apache-http-entity-fileentity-deprecated – CommonsWare Feb 03 '16 at 17:41
  • @CommonsWare isnt HttpClient deprecated – meda Feb 03 '16 at 20:46
  • @meda: The HttpClient that is in the Android SDK is deprecated. Apache's independent packaging of HttpClient can be used instead, if desired. – CommonsWare Feb 03 '16 at 21:01

1 Answers1

0

Change to:

public interface MyDosAPI {
  @POST("/kunde")
  public void checkEmail(@Body String email, Callback<EmailCheck> response);
}
skypjack
  • 49,335
  • 19
  • 95
  • 187
Viswajith
  • 31
  • 9