पोस्ट अनुरोध करने के लिए OKHTTP का उपयोग कैसे करें?


91

मैंने कुछ उदाहरण पढ़े जो सर्वर पर jsons पोस्ट कर रहे हैं।

कोई कहता है:

OkHttp जावा द्वारा प्रदत्त HttpUrlConnection इंटरफ़ेस का एक कार्यान्वयन है। यह सामग्री लिखने के लिए एक इनपुट स्ट्रीम प्रदान करता है और उस सामग्री के प्रारूप के बारे में (या देखभाल) नहीं जानता है।

अब मैं URL के नाम और पासवर्ड के साथ एक सामान्य पोस्ट बनाना चाहता हूं।

इसका मतलब है कि मुझे नाम और मूल्य जोड़ी को अपने द्वारा स्ट्रीम में एन्कोड करने की आवश्यकता है?


मैंने एंड्रॉइड में okhttp लाइब्रेरी का उपयोग करके एपीआई (http पोस्ट) के मापदंडों को जोड़ने के लिए एक संबंधित प्रश्न का उत्तर लिखा । यह केवल OkHttp का उपयोग करता है।
सूफियान

हालांकि चिह्नित उत्तर सही है, यह केवल 3.0 से पहले के संस्करणों के साथ काम करता है। मैंने इस पर एक उत्तर जोड़ा है कि अब यह कैसे काम कर रहा है :)
मौकर

यहाँ पोस्ट अनुरोध भेजने के तरीके पर okhttp3 का पूरा उदाहरण दिया गया है
साकिब सामी

जवाबों:


101

वर्तमान स्वीकृत उत्तर पुराना है। अब यदि आप एक पोस्ट अनुरोध बनाना चाहते हैं और इसमें पैरामीटर जोड़ना चाहते हैं, तो आपको MultipartBody को उपयोगकर्ता बनाना चाहिए। माइस्ट क्राफ्ट के रूप में वर्तमान में पदावनत किया गया है

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("somParam", "someValue")
        .build();

Request request = new Request.Builder()
        .url(BASE_URL + route)
        .post(requestBody)
        .build();

5
मेरा मानना ​​है कि मूल प्रश्न का माइम क्राफ्ट से कोई लेना-देना नहीं था। और दोनों पुराने स्वीकार किए गए उत्तर के रूप में, सबसे अधिक मतदान वाले ने पहले ही उत्तर दिया कि कैसे OKHttp संस्करणों 2.x और 3.x के साथ POST अनुरोध किया जाए।
मौकर

बॉडी में इंटेगर कैसे भेजें?
एड्रियन पोटिंगर

intएक String@AqibBangash में परिवर्तित करें
Mauker

2
इस उत्तर कार्य के लिए आपको सामग्री-प्रकार के शीर्षलेख जोड़ना चाहिए जैसे: .addHeader("Content-Type", " application/x-www-form-urlencoded")
ruzenhack

114

डॉक्स के अनुसार , OkHttp संस्करण 3 के FormEncodingBuilderसाथ प्रतिस्थापित किया गया FormBodyऔर FormBody.Builder()इसलिए, पुराने उदाहरण अब काम नहीं करेंगे।

प्रपत्र और मल्टीपार्ट निकाय अब मॉडल किए गए हैं। हमने अपारदर्शी FormEncodingBuilderको अधिक शक्तिशाली FormBodyऔर FormBody.Builderकॉम्बो से बदल दिया है ।

इसी तरह हम अपग्रेड कर दिया है MultipartBuilderमें MultipartBody, MultipartBody.Part, और MultipartBody.Builder

इसलिए यदि आप OkHttp 3.x का उपयोग कर रहे हैं, तो निम्न उदाहरण आज़माएँ:

OkHttpClient client = new OkHttpClient();

RequestBody formBody = new FormBody.Builder()
        .add("message", "Your message")
        .build();
Request request = new Request.Builder()
        .url("http://www.foo.bar/index.php")
        .post(formBody)
        .build();

try {
    Response response = client.newCall(request).execute();

    // Do something with the response.
} catch (IOException e) {
    e.printStackTrace();
}

1
क्या हमें AsyncTask के अंदर उपरोक्त कोड लागू करने की आवश्यकता है?
वनपंचमैन

3
अंदर AsyncTask, या IntentService, या मुख्य सूत्र को छोड़कर कहीं भी :)
मौकर

.add("message", "Your message")में addविधि कॉल दो स्ट्रिंग तर्क क्या है? मैं केवल एक बॉडी स्ट्रिंग कंटेंट पास करना चाहता हूं । कैसे?
János

1
पहला तर्क कुंजी है, दूसरा मान है।
माऊकर

मुझे उपरोक्त विधि से कॉल से अशक्त प्रतिक्रिया मिलती है, जबकि कर्ल से कॉल करने पर मुझे उचित प्रतिक्रिया मिलती है। क्या कारण हो सकता है?
रमेश पारीक

37
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());
  }

19

आप के साथ तार से बचने के द्वारा यह अपने आप को सांकेतिक शब्दों में बदलना करने की जरूरत है URLEncoder और उनके साथ शामिल होने "="और "&"। या आप Mimecraft से FormEncoder का उपयोग कर सकते हैं जो आपको एक आसान बिल्डर देता है।

FormEncoding fe = new FormEncoding.Builder()
    .add("name", "Lorem Ipsum")
    .add("occupation", "Filler Text")
    .build();

1
धन्यवाद। ओकेटीटीपी के साथ फ़ाइल अपलोड करने के लिए कैसे? stackoverflow.com/questions/23512547/… लगता है कि यह वास्तव में अच्छा काम है।
user2219372

1
यह OkHttp 3.x पर काम नहीं कर रहा है। यह देखने के लिए कि यह कैसे काम करता है, मेरे उत्तर की जाँच करें :)
Mauker

जीईटी मापदंडों की तलाश करने वालों के लिए: HttpUrlक्लास को देखें (ओकेहटप लीब से)।
मौकर

15

आप इसे इस तरह बना सकते हैं:

    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    RequestBody body = RequestBody.create(JSON, "{"jsonExample":"value"}");

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .addHeader("Authorization", "header value") //Notice this request has header if you don't need to send a header just erase this part
            .build();

    Call call = client.newCall(request);

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {

            Log.e("HttpService", "onFailure() Request was: " + request);

            e.printStackTrace();
        }

        @Override
        public void onResponse(Response r) throws IOException {

            response = r.body().string();

            Log.e("response ", "onResponse(): " + response );

        }
    });

अब तक
अपदस्थ

4

एक निर्भरता के रूप में okhttp जोड़ने के लिए निम्नानुसार है

  • एंड्रॉइड स्टूडियो पर ऐप पर राइट क्लिक करें "मॉड्यूल सेटिंग्स" खोलें
  • "निर्भरता" -> "पुस्तकालय निर्भरता जोड़ें" -> "com.squareup.okhttp3: okhttp: 3.10.0" -> add -> ok ..

अब आपके पास एक निर्भरता के रूप में okhttp है

अब नीचे एक इंटरफ़ेस डिज़ाइन करें ताकि नेटवर्क रिस्पॉन्स मिलते ही हम अपनी गतिविधि पर कॉलबैक कर सकें।

public interface NetworkCallback {

    public void getResponse(String res);
}

मैं NetworkTask नाम की एक क्लास बनाता हूँ ताकि मैं इस नेटवर्क का उपयोग सभी नेटवर्क अनुरोधों को संभालने के लिए कर सकूँ

    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);
    }
}

अब मुझे दिखाते हैं कि किसी गतिविधि पर कॉलबैक कैसे प्राप्त करें

    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)
    }
}

4

POSTहेडर में टोकन के साथ OkHttp अनुरोध

       RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("search", "a")
            .addFormDataPart("model", "1")
            .addFormDataPart("in", "1")
            .addFormDataPart("id", "1")
            .build();
    OkHttpClient client = new OkHttpClient();
    okhttp3.Request request = new okhttp3.Request.Builder()
            .url("https://somedomain.com/api")
            .post(requestBody)
            .addHeader("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIkMnkkMTAkZzZrLkwySlFCZlBmN1RTb3g3bmNpTzltcVwvemRVN2JtVC42SXN0SFZtbzZHNlFNSkZRWWRlIiwic3ViIjo0NSwiaWF0IjoxNTUwODk4NDc0LCJleHAiOjE1NTM0OTA0NzR9.tefIaPzefLftE7q0yKI8O87XXATwowEUk_XkAOOQzfw")
            .addHeader("cache-control", "no-cache")
            .addHeader("Postman-Token", "7e231ef9-5236-40d1-a28f-e5986f936877")
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, okhttp3.Response response) throws IOException {
            if (response.isSuccessful()) {
                final String myResponse = response.body().string();

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("response", myResponse);
                        progress.hide();
                    }
                });
            }
        }
    });

3

यह एक अनुरोध निकाय के बिना OKHTTP पोस्ट अनुरोध को लागू करने के संभावित समाधानों में से एक है।

RequestBody reqbody = RequestBody.create(null, new byte[0]);  
Request.Builder formBody = new Request.Builder().url(url).method("POST",reqbody).header("Content-Length", "0");
clientOk.newCall(formBody.build()).enqueue(OkHttpCallBack());

ऊपर कोड ठीक काम कर रहा है, लेकिन मैं requestbody के साथ चाहता हूँ। मैंने कुछ उदाहरणों की कोशिश की, लेकिन त्रुटि प्रदर्शित करने में काम नहीं किया: "आपके पास इस url तक पहुंचने की अनुमति नहीं है"
वेंकटेश

2

आपको lynda.com पर ट्यूटोरियल चेक करना चाहिए । यहां मापदंडों को एन्कोड करने, HTTP अनुरोध करने और फिर json ऑब्जेक्ट के लिए पार्स प्रतिक्रिया करने का एक उदाहरण दिया गया है।

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();
    }

2
   protected Void doInBackground(String... movieIds) {
                for (; count <= 1; count++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                Resources res = getResources();
                String web_link = res.getString(R.string.website);

                OkHttpClient client = new OkHttpClient();

                RequestBody formBody = new FormBody.Builder()
                        .add("name", name)
                        .add("bsname", bsname)
                        .add("email", email)
                        .add("phone", phone)
                        .add("whatsapp", wapp)
                        .add("location", location)
                        .add("country", country)
                        .add("state", state)
                        .add("city", city)
                        .add("zip", zip)
                        .add("fb", fb)
                        .add("tw", tw)
                        .add("in", in)
                        .add("age", age)
                        .add("gender", gender)
                        .add("image", encodeimg)
                        .add("uid", user_id)
                        .build();
                Request request = new Request.Builder()
                        .url(web_link+"edit_profile.php")
                        .post(formBody)
                        .build();

                try {
                    Response response = client.newCall(request).execute();

                    JSONArray array = new JSONArray(response.body().string());
                    JSONObject object = array.getJSONObject(0);

                    hashMap.put("msg",object.getString("msgtype"));
                    hashMap.put("msg",object.getString("msg"));
                    // Do something with the response.
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }



                return null;
            }

बिटमैप बिटमैप = अशक्त; if (selectphoto! = null) {try {bitmap = ImageLoader.init ()। from (selectphoto) .requestSize (512, 512) .getBitmap (); } पकड़ (FileNotFoundException e) {e.printStackTrace (); } encodeimg = ImageBase64.encode (बिटमैप); }
उत्सव कुंडू

1

यहाँ मेरा तरीका है कि पोस्ट रिक्वेस्ट को पहले मेथड में पास करें और जैसे डेटा

HashMap<String, String> param = new HashMap<String, String>();

param.put("Name", name);
param.put("Email", email);
param.put("Password", password);
param.put("Img_Name", "");

final JSONObject result = doPostRequest(map,Url);

public static JSONObject doPostRequest(HashMap<String, String> data, String url) {

    try {
        RequestBody requestBody;
        MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

        if (data != null) {


            for (String key : data.keySet()) {
                String value = data.get(key);
                Utility.printLog("Key Values", key + "-----------------" + value);

                mBuilder.addFormDataPart(key, value);

            }
        } else {
            mBuilder.addFormDataPart("temp", "temp");
        }
        requestBody = mBuilder.build();


        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();
        Utility.printLog("URL", url);
        Utility.printLog("Response", responseBody);
        return new JSONObject(responseBody);

    } catch (UnknownHostException | UnsupportedEncodingException e) {

        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Error: " + e.getLocalizedMessage());
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
    }
    return null;
}


1
  1. निम्न को build.gradle में जोड़ें

compile 'com.squareup.okhttp3:okhttp:3.7.0'

  1. एक नया थ्रेड बनाएँ, नए थ्रेड में निम्न कोड जोड़ें।
OkHttpClient client = new OkHttpClient();
MediaType MIMEType= MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create (MIMEType,"{}");
Request request = new Request.Builder().url(url).post(requestBody).build();
Response response = client.newCall(request).execute();

-4
 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;

    }

1
इतनी सरल बात के लिए इतना कोड क्यों है? कृपया समझाएँ।
james.garriss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.