2016-05-25 3 views
0

Доброе утро вместе,android send http post request - правильный способ

Я нашел полезное руководство по выполнению запроса HTTP POST с помощью android. этот код работает отлично, но я хотел бы знать, если этот код является лучшим способом сделать это, или если у вас есть идеи, как я могу его оптимизировать.

private class PostClass extends AsyncTask<String, String, String> { 

     Context context; 

     public PostClass(Context c){ 
      this.context = c; 
     } 


     @Override 
     protected String doInBackground(String... params) { 
      try { 

       URL url = new URL("xxxx"); 

       HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
       String urlParameters = "xxx"; 

       connection.setRequestMethod("POST"); 
       connection.setDoOutput(true); 
       DataOutputStream dStream = new DataOutputStream(connection.getOutputStream()); 
       dStream.writeBytes(urlParameters); 
       dStream.flush(); 
       dStream.close(); 


       BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
       final String response = br.readLine(); 
       br.close(); 

       return response; 


      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 




     protected void onPostExecute(String result){ 
      Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show(); 
     } 

    } 
+1

Предлагаю вам использовать библиотеку Volley для запроса REST. Это проще, чем AsyncTask. – Tomislav

+0

да это хорошо. как говорится в [Docs] (https://developer.android.com/reference/java/net/HttpURLConnection.html) –

+0

Если вы не используете какую-либо библиотеку, это правильный и стандартный способ, который вы найдете в руководстве разработчика Google. –

ответ

1

на основе частоты синхронизации, вы можете использовать Volley. Кроме того, вы можете использовать следующий код, где вам нужно отправить несколько параметров в запрос POST.

HttpClient httpclient = new DefaultHttpClient(); 
     String responseStr=""; 
     String URL=Constants.API_URL;#URL where request needs to be sent 
     HttpPost httppost = new HttpPost(URL); 

     try { 
      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("id", pick_up_id)); 
      nameValuePairs.add(new BasicNameValuePair("driver_photo", strPhoto));#image in form of Base64 String which you need to send 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httppost); 

      int responseCode = response.getStatusLine().getStatusCode(); 
      switch(responseCode) { 
      case 200: 
       HttpEntity entity = response.getEntity(); 
       if(entity != null) { 
        String responseBody = EntityUtils.toString(entity); 
        responseStr=responseBody; 
       } 
       break; 
      } 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     } 
     System.out.println("this is response "+responseStr); 
+0

HTTPClient устарел в API 23 Я думаю. И вам нужно добавить зависимости. –

0

Вот пример HTTP Post запрос с использованием Volly library

 void MakePostRequest() { 
      StringRequest postRequest = new StringRequest(Request.Method.POST, EndPoints.BASE_URL_ADS, 
        new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) { 
          try { 
           JSONObject jsonResponse = new JSONObject(response); 
           value1= jsonResponse.getString("Your ID1"); 
           value2= jsonResponse.getString("Your ID2"); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
           banner_id = null; 
           full_id = null; 
          } 
         } 
        }, 
        new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          error.printStackTrace(); 
          value1= null; 
          value2= null; 
         } 
        } 
      ) { 
      // here is params will add to your url using post method 
       @Override 
       protected Map<String, String> getParams() { 
        Map<String, String> params = new HashMap<>(); 
        params.put("app", getString(R.string.app_name)); 
        //params.put("2ndParamName","valueoF2ndParam"); 
        return params; 
       } 
      }; 
      Volley.newRequestQueue(this).add(postRequest); 
     } 

этот запрос пост использует эту compile 'com.mcxiaoke.volley:library:1.0.19' залпа версию.

Я просто добавляю имя приложения в качестве параметра. Вы можете добавить дополнительные параметры.

0

Да, это правильно. Я сделал библиотеку, которая выглядит примерно так под капотом, для обработки запросов, как это: https://github.com/gjudkins/GjuddyRequest

добавить зависимость к вам build.gradle:

repositories { 
    maven { 
    url 'https://dl.bintray.com/gjudkins/maven' 
    } 
} 

dependencies { 
    compile 'com.gjuddy:easyhttprequest:0.1.17' 
} 

затем делает запрос будет выглядеть примерно так :

// define headers 
ContentValues headers = new ContentValues(); 
bodyParams.put("FirstHeader","header-value"); 
bodyParams.put("AnotherHeader","add as many as you want"); 

// define parameters 
ContentValues bodyParams = new ContentValues(); 
bodyParams.put("name","the_name"); 
bodyParams.put("another_param","add as many as you want"); 

// define how GjuddyRequest will format the body/parameters of the request 
// !! The appropriate headers for the ContentType defined here are AUTOMATICALLY added to the request !! 
GjuddyRequest.ContentType bodyFormat = GjuddyRequest.ContentType.x_www_url_form_urlencoded; 

// make the POST request 
GjuddyRequest.getInstance().makePostAsync("https://your.api.url", bodyParams, bodyFormat, headers, new GjuddyRequest.HttpRequestCallback() { 
    @Override 
    public void requestComplete(GjuddyResponse response) { 
     // check for errors 
     if (response.getErrors() == null) { 
      // the GjuddyResponse object can automatically retrieve the response 
      // as a String, JSONObject, or JSONArray 
      JSONObject jsonResponse = response.toJSONObject(); 
      Log.e("GJUDDY", response.toString()); 
     } else { 
      Log.e("GJUDDY", response.getErrorString()); 
     } 
    } 
}); 

ридй GitHub в ссылке идет в глубину о том, как использовать его, но это довольно легко.

+0

Похоже на то, что может сделать OkHttp, поэтому я предполагаю, что вы сделали это как опыт обучения? –

+0

@ cricket_007, в основном да. Я никогда не использовал библиотеку для http-запросов и продолжал писать свою собственную оболочку для HttpUrlConnection. В конце концов (совсем недавно) я решил просто создать библиотеку. – gjudkins