Problems with a Build_HttpBody() // httpPost.setEntity() - Android

后端 未结 2 569
孤街浪徒
孤街浪徒 2020-12-22 00:29

I develop AndroidApps with AndroidStudio I start to do a simple HttpPost Request and I had a problems, all post that I could find do this:

private void Check         


        
相关标签:
2条回答
  • 2020-12-22 00:57

    Updated 2016

    Using HttpURLConnection class we need to open BufferedWritter to insert our entity values as the following code:

    //Declaration of variables
    private List<NameValuePair> ListOfValues;
    ...
    
    public Check_Loguin_Request(Context cx,String url, List<NameValuePair> ListOfValues)
    {
        this.cx = cx;
        this.Url = url;
        this.ListOfValues= ListOfValues;
    }
    
    @Override
    protected String doInBackground(String... strings) {
    
        //Declaration of variables
        InputStream is = null;
        String Result = "";
    
        URL urll = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) urll.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);
    
        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
        writer.write(Build_HttpBody(ListOfValues));
        writer.flush();
        writer.close();
        os.close();
    
        // Starts request
        conn.connect();
        int ResponseCode = conn.getResponseCode();
    
        if (ResponseCode == 200) {
            is = conn.getInputStream();
            String EntityResult = ReadResponse_HttpURLConnection(is);
        } 
        else {
            throw new RuntimeException("Invalid Status Code");
        }
    }
    

    Attention the DefaultHttpClient class is deprecated (2011)

    For more info following this link.

    Try to use this following code, remember for this case always use AsyncTask:

     private class Check_Loguin_Request extends AsyncTask <String,Void,String>{
    
        Context cx;
        String Url;
        List<NameValuePair> BodyRequest_Elements;
    
        public Check_Loguin_Request(Context cx,String url, List<NameValuePair> ListOfValues)
        {
            this.cx = cx;
            this.Url = url;
            this.BodyRequest_Elements = ListOfValues;
        }
    
        private String convertStreamToString(InputStream is) {
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
    
            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }
    
        @Override
        protected String doInBackground(String... strings) {
    
            //Declaration of variables
            DefaultHttpClient httpClient;
            HttpPost Request = new HttpPost(url_Loguin);
            HttpResponse Response;
            HttpParams httpParameters = new BasicHttpParams();
            httpParameters.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    
            // Set the timeout in milliseconds until a connection is established.
            // The default value is zero, that means the timeout is not used.
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT)
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            httpClient = new DefaultHttpClient(httpParameters);
    
    
            try {
                HttpEntity entity = new UrlEncodedFormEntity(BodyRequest_Elements);
                Request.setHeader(entity.getContentType());
                Request.setEntity(entity);
    
                Response = httpClient.execute(Request);
    
                if(Response.getStatusLine().getStatusCode() == 200){
                    String EntityResult = EntityUtils.toString(Response.getEntity());
                    //HttpEntity EntityResult = Response.getEntity();
                    //InputStream iStream = EntityResult.getContent();
                    //JSONObject json = new JSONObject(convertStreamToString(iStream));
    
                    EntityResult = EntityResult.replaceAll("[()]", "");
                    JSONObject json = new JSONObject(EntityResult);
    
                    String Result = json.optString("code").toString();
                    return Result;
                }
                else{
                    throw new RuntimeException("Invalid Status Code");
                }
            }
            catch (Exception ex){
                Log.getStackTraceString(ex);
                return ex.toString();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-22 01:05

    You are obviously not handling the IO exceptions being thrown from the constructor:

    see: Android docs on UrlEncodedFormEntity

    What puzzles me is that your IDE is not reporting this, or how this code even compiles, let alone runs/debugs.

    Edit: If you are new at this stuff, maybe it would be worth to take a look at: Android Volley , which is a quite simple yet effective library developed by Google for Android networking.

    0 讨论(0)
提交回复
热议问题