পোস্টের অনুরোধ করতে কীভাবে OkHTTP ব্যবহার করবেন?


92

আমি কয়েকটি উদাহরণ পড়েছি যা সার্ভারে জন্স পোস্ট করছে।

কেউ একজন বলেছেন:

OkHttp হ'ল জাভা দ্বারা সরবরাহিত HttpUrlConnication ইন্টারফেসের একটি বাস্তবায়ন। এটি লিখিত সামগ্রী লিপিবদ্ধ করার জন্য একটি ইনপুট স্ট্রিম সরবরাহ করে এবং কী কী ফর্ম্যাট রয়েছে তা সম্পর্কে (বা যত্ন) জানেন না।

এখন আমি নাম এবং পাসওয়ার্ডের প্যারাম দিয়ে URL এ একটি সাধারণ পোস্ট করতে চাই।

এর অর্থ আমার নিজের দ্বারা স্ট্রিমের মধ্যে নাম এবং মান জোড়ার এনকোড করা দরকার?



চিহ্নিত উত্তরটি সঠিক হলেও এটি কেবল 3.0 এর পূর্ববর্তী সংস্করণগুলির সাথে কাজ করে। এটি এখন কীভাবে কাজ করছে সে সম্পর্কে আমি একটি উত্তর যুক্ত করেছি :)
মউকার

উত্তর:


102

বর্তমান গৃহীত উত্তর পুরানো। এখন আপনি একটি পোস্ট অনুরোধ তৈরি এবং এটি পরামিতি যোগ করেন তারা আপনার ব্যবহারকারীর MultipartBody.Builder উচিত করতে চান তাহলে মাইম ক্র্যাফট বর্তমানে অবচিত হয়েছে

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

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

4
আমি বিশ্বাস করি মাইম ক্রাফ্টের সাথে মূল প্রশ্নের কোনও মিল ছিল না। উভয়ই পুরানো স্বীকৃত উত্তর, যেহেতু সর্বাধিক ভোটপ্রাপ্ত একজন ইতিমধ্যে উত্তর দিয়েছেন যে কীভাবে OkHttp সংস্করণ 2.x এবং 3.x দিয়ে একটি পোষ্ট অনুরোধ করবেন make
মাউকার

অনুরোধ বডি ইনটিজারগুলি কীভাবে প্রেরণ করবেন?
অ্যাড্রিয়ান পটিংগার

রূপান্তর intএকটি থেকে String@AqibBangash
Mauker

4
এই উত্তর কাজের জন্য আপনার বিষয়বস্তু-টাইপের .addHeader("Content-Type", " application/x-www-form-urlencoded")
শিরোনামটি

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

4
অ্যাসিঙ্কটাস্কের ভিতরে কি আমাদের উপরের কোডটি প্রয়োগ করতে হবে?
ওয়ানপঞ্চমান

4
একটি ইনসাইড AsyncTask, অথবা IntentService, অথবা যে কোন জায়গায় ব্যতীত মূল থ্রেড মধ্যে :)
Mauker

.add("message", "Your message")মধ্যে addপদ্ধতি কল দুই স্ট্রিং যুক্তি কি? আমি কেবল একটি বডি স্ট্রিং সামগ্রীই পাস করতে চাই । কীভাবে?
জানুস

4
প্রথম যুক্তিটি কী, দ্বিতীয়টি মান।
মাউকার

আমি উপরের পদ্ধতির দ্বারা একটি কল থেকে নাল সাড়া পাই, যখন আমি কার্ল থেকে কল করি তখন সঠিক প্রতিক্রিয়া পাই। এর কারণ কী হতে পারে?
রমেশ পরিক

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 এবং তাদের সঙ্গে যোগ দেওয়ার "="এবং "&"। অথবা আপনি মাইক্রাফ্ট থেকে ফর্ম এনকোডার ব্যবহার করতে পারেন যা আপনাকে একটি কার্যকর বিল্ডার দেয়।

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

4
ধন্যবাদ .অখটিটিপি দিয়ে ফাইল আপলোড করবেন কীভাবে? stackoverflow.com/questions/23512547/… মনে হয় এটি সত্যিই একটি ভাল libs।
ব্যবহারকারী2219372

4
এটি OkHttp 3.x এ কাজ করছে না। এটি কীভাবে কাজ করে তা দেখতে, আমার উত্তরটি পরীক্ষা করুন :)
মউকার

জিইটি প্যারামিটারগুলির জন্য যারা খুঁজছেন তাদের জন্য: HttpUrlক্লাসটি দেখুন (OkHttp লাইব থেকে)।
মাউকার

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" -> অ্যাড -> ঠিক আছে ..

এখন আপনি নির্ভরতা হিসাবে okhttp আছে

এখন নীচের মত একটি ইন্টারফেস ডিজাইন করুন যাতে নেটওয়ার্ক প্রতিক্রিয়া পাওয়ার পরে আমরা আমাদের ক্রিয়াকলাপে কলব্যাক পেতে পারি।

public interface NetworkCallback {

    public void getResponse(String res);
}

আমি নেটওয়ার্কটাস্ক নামে একটি শ্রেণি তৈরি করেছি যাতে আমি এই ক্লাসটি সমস্ত নেটওয়ার্ক অনুরোধগুলি পরিচালনা করতে পারি

    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

এটি একটি অনুরোধ সংস্থা ছাড়াই ওকেএইচটিটিপি পোস্ট অনুরোধ বাস্তবায়নের অন্যতম সম্ভাব্য সমাধান।

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

উপরে কোডটি ঠিকঠাক কাজ করছে তবে আমি অনুরোধের সাথে চাই। আমি কয়েকটি উদাহরণ চেষ্টা করেছি কিন্তু ত্রুটি প্রদর্শনের জন্য কাজ করছি না: "আপনার কাছে এই ইউআরএলটি অ্যাক্সেস করার অনুমতি নেই"
ভেঙ্কটেশ

2

আপনার লেন্ডা ডটকমের টিউটোরিয়ালগুলি পরীক্ষা করা উচিত । এখানে প্যারামিটারগুলি কীভাবে এনকোড করা যায়, 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;
            }

বিটম্যাপ বিটম্যাপ = নাল; যদি (নির্বাচিত ফটো! = নাল) {চেষ্টা করুন {বিটম্যাপ = ইমেজলয়েডার.ইনিট ()। (নির্বাচিত ফটো) থেকে। } ধরা (ফাইলনিটফাউন্ডএক্সেপশন ই) {ই.প্রিন্টস্ট্যাকট্রেস (); } এনকোডেমগ = চিত্রবিজ ase৪.এনকোড (বিটম্যাপ); }
উত্সব কুন্ডু

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;

    }

4
এত সাধারণ জিনিসের জন্য এত কোড কেন? দয়া করে ব্যাখ্যা করুন.
james.garriss
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.