2017-06-01 2 views
0

Von Android versuche ich eine einfache POST-API anzufordern, die mit einem einfachen JSON-Objekt antwortet.Anrufen einer POST-API unter Android

Say, Ich habe eine einfache API (1.1.1.1/testApi), die mit einem Respons JSON Objekt, das enthält: Wertstatus

  • name::

    • Status Name Wert

    Calling the API using Postman funktioniert wie ein Zauber, also nehme ich an, dass meine API in Ordnung war.

    Ich habe bereits versucht, einige der Links unten:

    1. AsyncTask: Es gibt kein Beispiel dafür, wie die CallApi Objekt aufzurufen und die API-Adresse (zB URL) zu analysieren, so gibt es immer ein Fehler, wenn ich versuche das Objekt aufzurufen.
    2. Apache HTTP Client: wie der Link sagte, fast alle die Antwort für Android veraltet 6.0
    3. Retrofit: scheint brauchbar, aber ich kann nicht ein gutes Beispiel zu verwenden, dies in meinem Fall

    Ich finde Ich habe mir Zeit genommen, nach Lösungen zu suchen, aber afaik gibt es keine "einfache" Möglichkeit, eine POST-API aufzurufen.

    Gibt es eine einfache Methode, die eine URL-Eingabe und dann ein JSON-Objekt zurückgibt?

    Lassen Sie mich wissen, ob dies eine doppelte Frage war.

    Vielen Dank im Voraus.

  • +0

    Ihr Bild Link ist tot ... verwenden btw seine sehr einfach volley –

    +0

    zu verstehen, ich nachrüsten selbst bin mit und es funktioniert wie ein Charme. Probieren Sie [dieses Tutorial] (http://www.vogella.com/tutorials/Retrofit/article).html) –

    +1

    @SimonSchnell Danke für den Link zum Tutorial! Alle anderen Antworten auf diese Frage sind auch informierend und gut geschrieben, aber die Seite, die Sie mir gesagt haben, enthält die relevantesten Dinge bezüglich meines Problems. Gott segne dich :) – rahmatNazali

    Antwort

    1

    Hallo ich Retrofit Beispiel versuchen es auf Ihre Art und Weise Haben arbeiten zu verwenden

    des

    1) Gradle Lassen Sie beginnen

    compile 'com.google.code.gson:gson:2.2.4' 
        compile 'com.squareup.okhttp:okhttp:2.4.0' 
        compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' 
        compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 
        compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' 
    

    2) Schnittstelle

    public interface ServiceInterface { 
    @GET(HttpConstants.USERDATAJSON) 
        Call<ListData>taskData(@Query("method")String method,@Query("stdID")int stdID); 
    } 
    

    3) Service Class

    public class ServiceClass { 
        static ServiceInterface serviceInterface; 
    // public static final String baseUrl= HttpConstants.BASE_URL_GEONAME; 
        public static final String baseUrl= HttpConstants.baseUrl; 
    
        public static ServiceInterface connection(){ 
         if(serviceInterface==null){ 
          HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
          interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
          OkHttpClient client = new OkHttpClient(); 
          client.interceptors().add(new Interceptor() { 
           @Override 
           public Response intercept(Chain chain) throws IOException { 
            Response response=chain.proceed(chain.request()); 
            return response; 
           } 
          }); 
          Retrofit retrofit = new Retrofit.Builder() 
            .client(client) 
            .addConverterFactory(GsonConverterFactory.create()) 
            .baseUrl(baseUrl) 
            .build(); 
          serviceInterface=retrofit.create(ServiceInterface.class); 
         } 
         return serviceInterface; 
        } 
    } 
    

    4) Aufruf der Methode von Aktivität

    public void getTaskData(){ 
         ServiceInterface serviceInterface=ServiceClass.connection(); 
         Call<ListData> call=serviceInterface.taskData("getAllUsersSimple",0); 
         call.enqueue(new Callback<ListData>() { 
          @Override 
          public void onResponse(Response<ListData> response, Retrofit retrofit) { 
           Log.v("@@@Response",""+response.toString()); 
           if(response.isSuccess()){ 
            listData=response.body(); 
            dataList=listData.getData(); 
            printStudentDetails(dataList); 
    
           } 
          } 
    
          @Override 
          public void onFailure(Throwable t) { 
           Log.v("@@@Failure"," Message"+t.getMessage()); 
          } 
         }); 
        } 
    

    5) Die Pojo

    public class ListData { 
    
        @SerializedName("data") 
        @Expose 
        private List<DataPojo> data = null; 
        @SerializedName("code") 
        @Expose 
        private Integer code; 
        @SerializedName("message") 
        @Expose 
        private String message; 
    
        public List<DataPojo> getData() { 
         return data; 
        } 
    
        public void setData(List<DataPojo> data) { 
         this.data = data; 
        } 
    
        public Integer getCode() { 
         return code; 
        } 
    
        public void setCode(Integer code) { 
         this.code = code; 
        } 
    
        public String getMessage() { 
         return message; 
        } 
    
        public void setMessage(String message) { 
         this.message = message; 
        } 
    
    } 
    public class DataPojo { 
    
        @SerializedName("user_id") 
        @Expose 
        private String userId; 
        @SerializedName("user_name") 
        @Expose 
        private String userName; 
        @SerializedName("user_age") 
        @Expose 
        private String userAge; 
    
        public String getUserId() { 
         return userId; 
        } 
    
        public void setUserId(String userId) { 
         this.userId = userId; 
        } 
    
        public String getUserName() { 
         return userName; 
        } 
    
        public void setUserName(String userName) { 
         this.userName = userName; 
        } 
    
        public String getUserAge() { 
         return userAge; 
        } 
    
        public void setUserAge(String userAge) { 
         this.userAge = userAge; 
        } 
    
    } 
    

    Sie Ihre pojo diesen Link erstellen http://www.jsonschema2pojo.org/

    Weitere Referenz besuchen Sie den Link https://github.com/pratikvyas1991/NetworkingExample/tree/master/app

    +0

    Danke! Dieses Beispiel war klar genug für mich zu verstehen :)) – rahmatNazali

    1

    Rahmat. Sie können Android Volley Library ausprobieren, wenn Sie eine POST-Anfrage an Ihre Web-API senden möchten. Sie können die folgenden Links verweisen. Bibliothek

    Android Volley

    Android Volley Link Here

    Tutorial

    Android Hive Volley Tutorial

    Dzone Volley Tutorial

    +0

    Hallo Tan Yih Wei! Vielen Dank für Ihre freundliche Antwort und Vorschlag in Bezug auf Volley-Bibliothek, es war sehr informativ :)) – rahmatNazali

    1

    Sie RestTemplate mit Restful Dienst nutzen können Es ist ziemlich einfach. Unten ist ein Beispielcode, in dem ich ein Objekt poste.

    public MasterObject setMasterByBatch(MasterObject masterObject) { 
        try { 
         RestTemplate restTemplate = new RestTemplate(); 
         restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
    
         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
         StrictMode.setThreadPolicy(policy); 
    
         masterObject = restTemplate.postForObject(yourUrl, masterObject, MasterObject.class);   
    
        } catch (Exception e) { 
         e.printStackTrace(); 
         Log.e("masterObjPost_WsCli_EX", e.toString()); 
        } 
        return masterObject; 
    } 
    

    benötigt Diese wenigen Abhängigkeiten in Ihrem build.gradle (Modul: app):

    dependencies { 
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE' 
    compile 'com.fasterxml.jackson.core:jackson-core:2.6.0' 
    compile 'com.fasterxml.jackson.core:jackson-databind:2.6.0' 
    } 
    

    Wenn zeigt einen Fehler in Bezug auf org.spring Sie benötigen, um Frühjahr Bibliothek

    +0

    Vielen Dank für Ihre freundliche Antwort! Es wurde sehr informiert :)) – rahmatNazali

    0

    Persönlich bevorzuge ich Retrofit herunterladen und einsetzen, es ist wirklich einfach und wirklich schön

    http://square.github.io/retrofit/

    +1

    Danke für Ihren Vorschlag bezüglich Retrofit. Es funktioniert wie ein Charme :)) – rahmatNazali

    1

    AsyncTask Beispiel

    Persönlich bevorzuge ich auch Retrofit/Volley je nach Projektbedarf.

    Wenn Sie den Header zu Ihnen (testApi) Rest-API einstellen (Basic Authorization)

    String credentials = email + ":" + password; 
    String basicAuth = "Basic " + new String(new Base64().encode(credentials.getBytes())); 
    connection.setRequestProperty ("Authorization", basicAuth); 
    connection..setRequestProperty("Content-Language", "en-US"); 
    

    . Hinweis:

    1. Netzbetrieb/Anruf kann nicht im Hauptthread erfolgen . Sie müssen es von einem anderen Thread, asynchrone Aufgabe oder einer Intent-Dienst sollte

    2. Alle UI Betrieb OnPostExecute, OnPreExecute

    Anruf erfolgen AsyncTask laufen, wo Sie

    Der Code unten wollen kann dir helfen.

    import android.app.Activity; 
        import android.os.AsyncTask; 
        import android.support.v7.app.AppCompatActivity; 
        import android.os.Bundle; 
        import android.widget.Toast; 
        import org.json.JSONObject; 
        import java.io.BufferedReader; 
        import java.io.InputStreamReader; 
        import java.net.HttpURLConnection; 
        import java.net.URL; 
        import java.net.URLEncoder; 
        import java.util.HashMap; 
        import java.util.Map; 
    
        public class MainActivity extends AppCompatActivity { 
         String TEST_URL="http://172.16.68.4:8080/testApi"; 
         Activity activity; 
         @Override 
         protected void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState); 
          setContentView(R.layout.activity_main); 
          activity=MainActivity.this; 
    
          new PostAsyncTask().execute(); 
    
         } 
    
         private class PostAsyncTask extends AsyncTask<String,Void,JSONObject> { 
          @Override 
          protected void onPreExecute() { 
           super.onPreExecute(); 
          } 
    
          @Override 
          protected JSONObject doInBackground(String... params) { 
           String value="test"; 
           Map postData = new HashMap<>(); 
           postData.put("key",value); 
           return post(TEST_URL,postData); 
          } 
    
          @Override 
          protected void onPostExecute(JSONObject response) { 
           super.onPostExecute(response); 
           //All your UI operation can be performed here 
           //Response string can be converted to JSONObject/JSONArray like 
           try { 
            Toast.makeText(activity, String.format("%s : %s",response.getString("status"),response.getString("name")), Toast.LENGTH_LONG).show(); 
           } catch (Exception e) { 
            e.printStackTrace(); 
            Toast.makeText(activity, String.format("%s","Something went wrong!!!!!!"), Toast.LENGTH_LONG).show(); 
    
           } 
           System.out.println(response); 
          } 
         } 
         /** 
         * Method allows to HTTP POST request to the server to send data to a specified resource 
         * @param REQUEST_URL URL of the API to be requested 
         * @param params parameter that are to be send in the "body" of the request Ex: parameter=value&amp;also=another 
         * returns response as a JSON object 
         */ 
         public JSONObject post(String REQUEST_URL,Map<String, Object> params) { 
          JSONObject jsonObject = null; 
          BufferedReader reader = null; 
          try { URL url = new URL(REQUEST_URL); 
           StringBuilder postData = new StringBuilder(); 
           for (Map.Entry<String, Object> param : params.entrySet()) { 
            if (postData.length() != 0) postData.append('&'); 
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
            postData.append('='); 
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
           } 
           byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 
    
           HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
           connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
           connection.setConnectTimeout(8000); 
           connection.setRequestMethod("POST"); 
           connection.setUseCaches(false); 
           connection.setDoOutput(true); 
           connection.getOutputStream().write(postDataBytes); 
           connection.connect(); 
           StringBuilder sb; 
           int statusCode = connection.getResponseCode(); 
           if (statusCode == 200) { 
            sb = new StringBuilder(); 
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
            String line; 
            while ((line = reader.readLine()) != null) { 
             sb.append(line); 
            } 
            jsonObject = new JSONObject(sb.toString()); 
           } 
           connection.disconnect(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } finally { 
           if (reader != null) { 
            try { 
             reader.close(); 
            } catch (Exception e) { 
             e.printStackTrace(); 
            } 
           } 
          } 
          return jsonObject; 
         } 
        } 
    
    +0

    Vielen Dank für Ihre freundliche Antwort in Bezug auf AsyncTask! Ihr Beispiel beim Aufruf der AsyncTask war sehr hilfreich :)) – rahmatNazali

    Verwandte Themen