How to use OKHTTP to make a post request?

后端 未结 13 1050
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 05:06

I read some examples which are posting jsons to the server.

some one says :

OkHttp is an implementation of the HttpUrlConnection interface p

相关标签:
13条回答
  • 2020-12-02 05:39

    To add okhttp as a dependency do as follows

    • right click on the app on android studio open "module settings"
    • "dependencies"-> "add library dependency" -> "com.squareup.okhttp3:okhttp:3.10.0" -> add -> ok..

    now you have okhttp as a dependency

    Now design a interface as below so we can have the callback to our activity once the network response received.

    public interface NetworkCallback {
    
        public void getResponse(String res);
    }
    

    I create a class named NetworkTask so i can use this class to handle all the network requests

        public class NetworkTask extends AsyncTask<String , String, String>{
    
        public NetworkCallback instance;
        public String url ;
        public String json;
        public int task ;
        OkHttpClient client = new OkHttpClient();
        public static final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");
    
        public NetworkTask(){
    
        }
    
        public NetworkTask(NetworkCallback ins, String url, String json, int task){
            this.instance = ins;
            this.url = url;
            this.json = json;
            this.task = task;
        }
    
    
        public String doGetRequest() throws IOException {
            Request request = new Request.Builder()
                    .url(url)
                    .build();
    
            Response response = client.newCall(request).execute();
            return response.body().string();
        }
    
        public String doPostRequest() throws IOException {
            RequestBody body = RequestBody.create(JSON, json);
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Response response = client.newCall(request).execute();
            return response.body().string();
        }
    
        @Override
        protected String doInBackground(String[] params) {
            try {
                String response = "";
                switch(task){
                    case 1 :
                        response = doGetRequest();
                        break;
                    case 2:
                        response = doPostRequest();
                        break;
    
                }
                return response;
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            instance.getResponse(s);
        }
    }
    

    now let me show how to get the callback to an activity

        public class MainActivity extends AppCompatActivity implements NetworkCallback{
        String postUrl = "http://your-post-url-goes-here";
        String getUrl = "http://your-get-url-goes-here";
        Button doGetRq;
        Button doPostRq;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = findViewById(R.id.button);
    
            doGetRq = findViewById(R.id.button2);
        doPostRq = findViewById(R.id.button1);
    
            doPostRq.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.sendPostRq();
                }
            });
    
            doGetRq.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.sendGetRq();
                }
            });
        }
    
        public void sendPostRq(){
            JSONObject jo = new JSONObject();
            try {
                jo.put("email", "yourmail");
                jo.put("password","password");
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        // 2 because post rq is for the case 2
            NetworkTask t = new NetworkTask(this, postUrl,  jo.toString(), 2);
            t.execute(postUrl);
        }
    
        public void sendGetRq(){
    
        // 1 because get rq is for the case 1
            NetworkTask t = new NetworkTask(this, getUrl,  jo.toString(), 1);
            t.execute(getUrl);
        }
    
        @Override
        public void getResponse(String res) {
        // here is the response from NetworkTask class
        System.out.println(res)
        }
    }
    
    0 讨论(0)
  • 2020-12-02 05:40
     public static JSONObject doPostRequestWithSingleFile(String url,HashMap<String, String> data, File file,String fileParam) {
    
            try {
                final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    
                RequestBody requestBody;
                MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);
    
                for (String key : data.keySet()) {
                    String value = data.get(key);
                    Utility.printLog("Key Values", key + "-----------------" + value);
    
                    mBuilder.addFormDataPart(key, value);
    
                }
                if(file!=null) {
                    Log.e("File Name", file.getName() + "===========");
                    if (file.exists()) {
                        mBuilder.addFormDataPart(fileParam, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
                    }
                }
                requestBody = mBuilder.build();
                Request request = new Request.Builder()
                        .url(url)
                        .post(requestBody)
                        .build();
    
                OkHttpClient client = new OkHttpClient();
                Response response = client.newCall(request).execute();
                String result=response.body().string();
                Utility.printLog("Response",result+"");
                return new JSONObject(result);
    
            } catch (UnknownHostException | UnsupportedEncodingException e) {
                Log.e(TAG, "Error: " + e.getLocalizedMessage());
                JSONObject jsonObject=new JSONObject();
    
                try {
                    jsonObject.put("status","false");
                    jsonObject.put("message",e.getLocalizedMessage());
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            } catch (Exception e) {
                Log.e(TAG, "Other Error: " + e.getMessage());
                JSONObject jsonObject=new JSONObject();
    
                try {
                    jsonObject.put("status","false");
                    jsonObject.put("message",e.getLocalizedMessage());
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }
            return null;
        }
        public static JSONObject doGetRequest(HashMap<String, String> param,String url) {
            JSONObject result = null;
            String response;
            Set keys = param.keySet();
    
            int count = 0;
            for (Iterator i = keys.iterator(); i.hasNext(); ) {
                count++;
                String key = (String) i.next();
                String value = (String) param.get(key);
                if (count == param.size()) {
                    Log.e("Key",key+"");
                    Log.e("Value",value+"");
                    url += key + "=" + URLEncoder.encode(value);
    
                } else {
                    Log.e("Key",key+"");
                    Log.e("Value",value+"");
    
                    url += key + "=" + URLEncoder.encode(value) + "&";
                }
    
            }
    /*
            try {
                url=  URLEncoder.encode(url, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }*/
            Log.e("URL", url);
            OkHttpClient client = new OkHttpClient();
    
            Request request = new Request.Builder()
                    .url(url)
                    .build();
            Response responseClient = null;
            try {
    
    
                responseClient = client.newCall(request).execute();
                response = responseClient.body().string();
                result = new JSONObject(response);
                Log.e("response", response+"==============");
            } catch (Exception e) {
                JSONObject jsonObject=new JSONObject();
    
                try {
                    jsonObject.put("status","false");
                    jsonObject.put("message",e.getLocalizedMessage());
                    return  jsonObject;
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
    
            return result;
    
        }
    
    0 讨论(0)
  • 2020-12-02 05:41

    The current accepted answer is out of date. Now if you want to create a post request and add parameters to it you should user MultipartBody.Builder as Mime Craft now is deprecated.

    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("somParam", "someValue")
            .build();
    
    Request request = new Request.Builder()
            .url(BASE_URL + route)
            .post(requestBody)
            .build();
    
    0 讨论(0)
  • 2020-12-02 05:44

    You need to encode it yourself by escaping strings with URLEncoder and joining them with "=" and "&". Or you can use FormEncoder from Mimecraft which gives you a handy builder.

    FormEncoding fe = new FormEncoding.Builder()
        .add("name", "Lorem Ipsum")
        .add("occupation", "Filler Text")
        .build();
    
    0 讨论(0)
  • 2020-12-02 05:50

    You should check tutorials on lynda.com. Here is an example of how to encode the parameters, make HTTP request and then parse response to json object.

    public JSONObject getJSONFromUrl(String str_url, List<NameValuePair> params) {      
            String reply_str = null;
            BufferedReader reader = null;
    
            try {
                URL url = new URL(str_url);
                OkHttpClient client = new OkHttpClient();
                HttpURLConnection con = client.open(url);                           
                con.setDoOutput(true);
                OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
                writer.write(getEncodedParams(params));
                writer.flush();     
                StringBuilder sb = new StringBuilder();
                reader = new BufferedReader(new InputStreamReader(con.getInputStream()));           
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }           
                reply_str = sb.toString();              
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return null;
                    }
                }
            }
    
            // try parse the string to a JSON object. There are better ways to parse data.
            try {
                jObj = new JSONObject(reply_str);            
            } catch (JSONException e) {   
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }     
          return jObj;
        }
    
        //in this case it's NameValuePair, but you can use any container
        public String getEncodedParams(List<NameValuePair> params) {
            StringBuilder sb = new StringBuilder();
            for (NameValuePair nvp : params) {
                String key = nvp.getName();
                String param_value = nvp.getValue();
                String value = null;
                try {
                    value = URLEncoder.encode(param_value, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
    
                if (sb.length() > 0) {
                    sb.append("&");
                }
                sb.append(key + "=" + value);
            }
            return sb.toString();
        }
    
    0 讨论(0)
  • 2020-12-02 05:52
    private final OkHttpClient client = new OkHttpClient();
    
      public void run() throws Exception {
        RequestBody formBody = new FormEncodingBuilder()
            .add("search", "Jurassic Park")
            .build();
        Request request = new Request.Builder()
            .url("https://en.wikipedia.org/w/index.php")
            .post(formBody)
            .build();
    
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
    
        System.out.println(response.body().string());
      }
    
    0 讨论(0)
提交回复
热议问题