Android HttpPost: hoe het resultaat te krijgen

Ik heb lang geprobeerd een HttpPost-verzoek te verzenden en een antwoord op te halen, maar hoewel ik een verbinding kon maken, begrijp ik nog niet hoe ik het string-bericht kan krijgen dat wordt geretourneerd door de request-response

HttpClient httpclient = new DefaultHttpClient();
 HttpPost httppost = new HttpPost("http://www.myurl.com/app/page.php");
 // Add your data   
 List < NameValuePair > nameValuePairs = new ArrayList < NameValuePair > (5);
 nameValuePairs.add(new BasicNameValuePair("type", "20"));
 nameValuePairs.add(new BasicNameValuePair("mob", "919895865899"));
 nameValuePairs.add(new BasicNameValuePair("pack", "0"));
 nameValuePairs.add(new BasicNameValuePair("exchk", "1"));
 try {
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     Log.d("myapp", "works till here. 2");
     try {
         HttpResponse response = httpclient.execute(httppost);
         Log.d("myapp", "response " + response.getEntity());
     } catch (ClientProtocolException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
 } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
 } 

Het spijt me, ik klink erg naïef omdat ik nieuw ben in Java. Help me alsjeblieft.


Antwoord 1, autoriteit 100%

Probeer de EntityUtilte gebruiken in uw antwoord:

String responseBody = EntityUtils.toString(response.getEntity());

Antwoord 2, autoriteit 8%

   URL url;
    url = new URL("https://www.url.com/app.php");
    URLConnection connection;
    connection = url.openConnection();
    HttpURLConnection httppost = (HttpURLConnection) connection;
    httppost.setDoInput(true);
    httppost.setDoOutput(true);
    httppost.setRequestMethod("POST");
    httppost.setRequestProperty("User-Agent", "Tranz-Version-t1.914");
    httppost.setRequestProperty("Accept_Language", "en-US");
    httppost.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded");
    DataOutputStream dos = new DataOutputStream(httppost.getOutputStream());
    dos.write(b); // bytes[] b of post data
    String reply;
    InputStream in = httppost.getInputStream();
    StringBuffer sb = new StringBuffer();
    try {
        int chr;
        while ((chr = in.read()) != -1) {
            sb.append((char) chr);
        }
        reply = sb.toString();
    } finally {
        in.close();
    }

Dit codefragment werkt.
Ik kreeg het na lang zoeken, maar van een J2ME-code.


Antwoord 3, autoriteit 7%

Je kunt de execute methode aanroepen met een ResponseHandler. Hier is een voorbeeld:

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = httpClient.execute(httppost, responseHandler);

Antwoord 4, autoriteit 4%

Je kunt dit op deze manier doen:

public class MyHttpPostProjectActivity extends Activity implements OnClickListener {
        private EditText usernameEditText;
        private EditText passwordEditText;
        private Button sendPostReqButton;
        private Button clearButton;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.login);
            usernameEditText = (EditText) findViewById(R.id.login_username_editText);
            passwordEditText = (EditText) findViewById(R.id.login_password_editText);
            sendPostReqButton = (Button) findViewById(R.id.login_sendPostReq_button);
            sendPostReqButton.setOnClickListener(this);
            clearButton = (Button) findViewById(R.id.login_clear_button);
            clearButton.setOnClickListener(this);        
        }
        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.login_clear_button){
                usernameEditText.setText("");
                passwordEditText.setText("");
                passwordEditText.setCursorVisible(false);
                passwordEditText.setFocusable(false);
                usernameEditText.setCursorVisible(true);
                passwordEditText.setFocusable(true);
            }else if(v.getId() == R.id.login_sendPostReq_button){
                String givenUsername = usernameEditText.getEditableText().toString();
                String givenPassword = passwordEditText.getEditableText().toString();
                System.out.println("Given username :" + givenUsername + " Given password :" + givenPassword);
                sendPostRequest(givenUsername, givenPassword);
            }   
        }
        private void sendPostRequest(String givenUsername, String givenPassword) {
            class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{
                @Override
                protected String doInBackground(String... params) {
                    String paramUsername = params[0];
                    String paramPassword = params[1];
                    System.out.println("*** doInBackground ** paramUsername " + paramUsername + " paramPassword :" + paramPassword);
                    HttpClient httpClient = new DefaultHttpClient();
                    // In a POST request, we don't pass the values in the URL.
                    //Therefore we use only the web page URL as the parameter of the HttpPost argument
                    HttpPost httpPost = new HttpPost("http://www.nirmana.lk/hec/android/postLogin.php");
                    // Because we are not passing values over the URL, we should have a mechanism to pass the values that can be
                    //uniquely separate by the other end.
                    //To achieve that we use BasicNameValuePair             
                    //Things we need to pass with the POST request
                    BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair("paramUsername", paramUsername);
                    BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair("paramPassword", paramPassword);
                    // We add the content that we want to pass with the POST request to as name-value pairs
                    //Now we put those sending details to an ArrayList with type safe of NameValuePair
                    List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
                    nameValuePairList.add(usernameBasicNameValuePair);
                    nameValuePairList.add(passwordBasicNameValuePAir);
                    try {
                        // UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs. 
                        //This is typically useful while sending an HTTP POST request. 
                        UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);
                        // setEntity() hands the entity (here it is urlEncodedFormEntity) to the request.
                        httpPost.setEntity(urlEncodedFormEntity);
                        try {
                            // HttpResponse is an interface just like HttpPost.
                            //Therefore we can't initialize them
                            HttpResponse httpResponse = httpClient.execute(httpPost);
                            // According to the JAVA API, InputStream constructor do nothing. 
                            //So we can't initialize InputStream although it is not an interface
                            InputStream inputStream = httpResponse.getEntity().getContent();
                            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                            StringBuilder stringBuilder = new StringBuilder();
                            String bufferedStrChunk = null;
                            while((bufferedStrChunk = bufferedReader.readLine()) != null){
                                stringBuilder.append(bufferedStrChunk);
                            }
                            return stringBuilder.toString();
                        } catch (ClientProtocolException cpe) {
                            System.out.println("First Exception caz of HttpResponese :" + cpe);
                            cpe.printStackTrace();
                        } catch (IOException ioe) {
                            System.out.println("Second Exception caz of HttpResponse :" + ioe);
                            ioe.printStackTrace();
                        }
                    } catch (UnsupportedEncodingException uee) {
                        System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
                        uee.printStackTrace();
                    }
                    return null;
                }
                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);
                    if(result.equals("working")){
                        Toast.makeText(getApplicationContext(), "HTTP POST is working...", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(getApplicationContext(), "Invalid POST req...", Toast.LENGTH_LONG).show();
                    }
                }           
            }
            SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
            sendPostReqAsyncTask.execute(givenUsername, givenPassword);     
        }
    }

Antwoord 5

Probeer dit, het lijkt de meest compacte te zijn. Hoewel je in de echte wereld een asynchroon verzoek moet gebruiken, zodat het apparaat niet vastloopt terwijl de opgevraagde pagina wordt opgehaald.

http://www.softwarepassion.com /android-series-get-post-and-multipart-post-requests/


Antwoord 6

Probeer HttpGet te gebruiken in plaats van HttpPost. Ik had een soortgelijk probleem en daarmee is het opgelost.

Other episodes