ভলির অনুরোধে কাস্টম শিরোনাম কীভাবে সেট করবেন


104

কীভাবে কাস্টম শিরোনামগুলি ভলির অনুরোধের জন্য সেট করা যেতে পারে? এই মুহুর্তে, কোনও পোষ্ট অনুরোধের জন্য বডি কন্টেন্ট সেট করার উপায় রয়েছে। আমি একটি সাধারণ জিইটি অনুরোধ করেছি, তবে পাশাপাশি কাস্টম শিরোনামগুলিও আমার পাস করতে হবে। আমি দেখতে পাচ্ছি না জেএসনরয়েস্ট ক্লাসটি কীভাবে এটি সমর্থন করে। এটা কি আদৌ সম্ভব?


দয়া করে গৃহীত উত্তরটি পরিবর্তন করুন, বর্তমানে গৃহীত উত্তরটি ভুল।
এস্তেবান

উত্তর:


118

দেখে মনে হচ্ছে আপনি ওভাররাইড public Map<String, String> getHeaders(), সংজ্ঞায়িতRequest , আপনার পছন্দসই HTTP- র হেডার দেখাবে।


4
@ জুয়ানজোসলেলেরোজিমেজ লিঙ্কটি নষ্ট হয়েছে। 404 পাওয়া যায় নি
মিলন

এখানে আরেকটি উদাহরণ রয়েছে (পৃষ্ঠার শেষে স্নিপেট): বিকাশকারী.অ্যান্ড্রয়েড / ট্রেনিং / ভোলি / রিয়েস্ট- কাস্টম এইচটিএমএল । আপনি নির্মাণকারীর মধ্য দিয়ে শিরোনাম পরামিতি সহ মানচিত্রটি ফেরত দেওয়ার জন্য শ্রেণি GsonRequestওভাররাইড পদ্ধতি method getHeaders()
জুয়ান জোসে মেলেরো গমেজ

157

GetParams () সহ স্বীকৃত উত্তরটি পোস্টের বডি ডেটা সেট করার জন্য, তবে শিরোনামে থাকা প্রশ্নটি কীভাবে ব্যবহারকারী-এজেন্টের মতো এইচটিটিপি শিরোনাম সেট করবেন তা জিজ্ঞাসা করা হয়েছিল। CommonsWare যেমন বলেছে, আপনি getHeeda () কে ওভাররাইড করবেন। এখানে কিছু নমুনা কোড যা ব্যবহারকারী-এজেন্টকে 'নিন্টেন্ডো গেমবয়' এবং 'গ্রহণ' -কে 'ফ্রিতে' সেট করে:

public void requestWithSomeHttpHeaders() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.somewebsite.com";
    StringRequest getRequest = new StringRequest(Request.Method.GET, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                // response
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                Log.d("ERROR","error => "+error.toString());
            }
        }
    ) {     
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError { 
                Map<String, String>  params = new HashMap<String, String>();  
                params.put("User-Agent", "Nintendo Gameboy");  
                params.put("Accept-Language", "fr");

                return params;  
        }
    };
    queue.add(getRequest);

}

এই উত্তরটিও JSONObjectRequest জন্য কাজ করবে? JSONObjectRequest postRequest = new JSONObjectRequest ...... কারণ আমি এটি করছি এবং আমার গেটহাইডার () বলা হচ্ছে না ... ??? আমি বুঝতে পারি যে আপনি একটি বেনাম শ্রেণি তৈরি করছেন এবং পদ্ধতিগুলিকে ওভাররাইড করছেন। আমি কেবল স্ট্রিংরেউকস্টের পরিবর্তে কেবল ডাব্লু / জেএসএনওবজেক্টরেক্সেস্ট করছি এবং আমার গেটহাইডার্স () বলা হয় না।
জেডিঅকটাউন

আমরা কি getHeilers () পদ্ধতিতে "কুকি" যুক্ত করতে পারি? এটি পোস্ট অনুরোধের পাশাপাশি কাজ করবে?
অর্ণব ব্যানার্জি

আমি POST এর বাকী ডেটা কোথায় পাঠাব?
ফার্নান্দো টরেস

30

আপনার যা প্রয়োজন তা হল url- এ তথ্য যুক্ত করার পরিবর্তে ডেটা পোস্ট করা।

public Request post(String url, String username, String password, 
      Listener listener, ErrorListener errorListener) {
  JSONObject params = new JSONObject();
  params.put("user", username);
  params.put("pass", password);
  Request req = new Request(
     Method.POST,
     url,
     params.toString(),
     listener,
     errorListener
  );

  return req;
}

আপনি যা করতে চান তা যদি অনুরোধের শিরোনামগুলি সম্পাদনা করে তবে আপনি যা করতে চান তা এটি:

// could be any class that implements Map
Map<String, String> mHeaders = new ArrayMap<String, String>();
mHeaders.put("user", USER);
mHeaders.put("pass", PASSWORD);
Request req = new Request(url, postBody, listener, errorListener) {
  public Map<String, String> getHeaders() {
    return mHeaders;
  }
}

44
আমি এই প্রশ্নটি একেবারেই জিজ্ঞাসা করিনি বলে হ্রাস পেয়েছি। এটি পোস্টের সামগ্রী নির্ধারণের জন্য, ব্যবহারকারী-এজেন্টের মতো কাস্টম এইচটিটিপি শিরোনাম স্থাপনের জন্য নয়। Zh। আটানাসভ এবং কমন্সওয়্যার তাদের getHeadersউত্তরগুলির সাথে সঠিক ।
জর্জিসিসি

4
আমি এই উত্তরটিকে অগ্রাহ্য করেছি কারণ ব্যবহারকারী এটি চেয়েছিলেন।
ধর্মেন্দ্র প্রতাপ সিং

1
এটি শিরোনাম নয় কনটেন্টের প্যারাম যুক্ত করার জন্য, দুঃখিত দুঃখিতও বঞ্চিত। এটি সত্যিই গৃহীত উত্তর হওয়া উচিত নয়
হুয়ান কর্টস

1
আপনি কি আমার প্রশ্নটি একবার দেখে নিতে পারেন? এটা এই অনুরূপ কিন্তু আমি এটা ঠিক না পেতে পারে stackoverflow.com/a/37948318
X09

18

আপনি এই সমাধান দেখতে পারেন । এটি কীভাবে কুকিজ পেতে / সেট করতে হয় তা দেখায়, তবে কুকিজগুলি একটি অনুরোধ / প্রতিক্রিয়াতে কেবল একটি শিরোনাম। আপনাকে ভলির একটি * অনুরোধ ক্লাসের ওভাররাইড করতে হবে এবং প্রয়োজনীয় শিরোনামটি সেট করতে হবেgetHeaders()


এখানে লিঙ্কযুক্ত উত্স:

public class StringRequest extends com.android.volley.toolbox.StringRequest {

private final Map<String, String> _params;

/**
 * @param method
 * @param url
 * @param params
 *            A {@link HashMap} to post with the request. Null is allowed
 *            and indicates no parameters will be posted along with request.
 * @param listener
 * @param errorListener
 */
public StringRequest(int method, String url, Map<String, String> params, Listener<String> listener,
        ErrorListener errorListener) {
    super(method, url, listener, errorListener);

    _params = params;
}

@Override
protected Map<String, String> getParams() {
    return _params;
}

/* (non-Javadoc)
 * @see com.android.volley.toolbox.StringRequest#parseNetworkResponse(com.android.volley.NetworkResponse)
 */
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
    // since we don't know which of the two underlying network vehicles
    // will Volley use, we have to handle and store session cookies manually
    MyApp.get().checkSessionCookie(response.headers);

    return super.parseNetworkResponse(response);
}

/* (non-Javadoc)
 * @see com.android.volley.Request#getHeaders()
 */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = super.getHeaders();

    if (headers == null
            || headers.equals(Collections.emptyMap())) {
        headers = new HashMap<String, String>();
    }

    MyApp.get().addSessionCookie(headers);

    return headers;
}

}

এবং মাই অ্যাপ্লিকেশন ক্লাস:

public class MyApp extends Application {
    private static final String SET_COOKIE_KEY = "Set-Cookie";
    private static final String COOKIE_KEY = "Cookie";
    private static final String SESSION_COOKIE = "sessionid";

    private static MyApp _instance;
    private RequestQueue _requestQueue;
    private SharedPreferences _preferences;

    public static MyApp get() {
        return _instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        _instance = this;
            _preferences = PreferenceManager.getDefaultSharedPreferences(this);
        _requestQueue = Volley.newRequestQueue(this);
    }

    public RequestQueue getRequestQueue() {
        return _requestQueue;
    }


    /**
     * Checks the response headers for session cookie and saves it
     * if it finds it.
     * @param headers Response Headers.
     */
    public final void checkSessionCookie(Map<String, String> headers) {
        if (headers.containsKey(SET_COOKIE_KEY)
                && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
                String cookie = headers.get(SET_COOKIE_KEY);
                if (cookie.length() > 0) {
                    String[] splitCookie = cookie.split(";");
                    String[] splitSessionId = splitCookie[0].split("=");
                    cookie = splitSessionId[1];
                    Editor prefEditor = _preferences.edit();
                    prefEditor.putString(SESSION_COOKIE, cookie);
                    prefEditor.commit();
                }
            }
    }

    /**
     * Adds session cookie to headers if exists.
     * @param headers
     */
    public final void addSessionCookie(Map<String, String> headers) {
        String sessionId = _preferences.getString(SESSION_COOKIE, "");
        if (sessionId.length() > 0) {
            StringBuilder builder = new StringBuilder();
            builder.append(SESSION_COOKIE);
            builder.append("=");
            builder.append(sessionId);
            if (headers.containsKey(COOKIE_KEY)) {
                builder.append("; ");
                builder.append(headers.get(COOKIE_KEY));
            }
            headers.put(COOKIE_KEY, builder.toString());
        }
    }

}

7

কোটলিনে,

আপনাকে গেটহাইডার্স () পদ্ধতিটিকে ওভাররাইড করতে হবে :

val volleyEnrollRequest = object : JsonObjectRequest(GET_POST_PARAM, TARGET_URL, PAYLOAD_BODY_IF_YOU_WISH,
            Response.Listener {
                // Success Part  
            },

            Response.ErrorListener {
                // Failure Part
            }
        ) {
            // Providing Request Headers

            override fun getHeaders(): Map<String, String> {
               // Create HashMap of your Headers as the example provided below

                val headers = HashMap<String, String>()
                headers["Content-Type"] = "application/json"
                headers["app_id"] = APP_ID
                headers["app_key"] = API_KEY

                return headers
            }
        }

1
এই একমাত্র সংস্থান যা আমি কোটলিনে ওভাররাইডিং শিরোনামগুলির সন্ধান করতে পারি। ধন্যবাদ!
ম্যাথিউ সোনকে

@ ম্যাথিউসনকে আমি আপনাকে ভাই অনুভব করি বিটিডাব্লু অ্যান্ড্রয়েডে নেটওয়ার্কিংয়ের জন্য রেট্রোফিট ব্যবহার করে।
দেবদিজয়

6

পাশাপাশি এই সমস্যার সমাধান খুঁজছি। এখানে কিছু দেখুন: http://developer.android.com/training/volley/request.html

ইমেজলয়েডারের পরিবর্তে সরাসরি চিত্রআরকোয়েস্ট ব্যবহার করা কি ভাল ধারণা? মনে হয় ইমেজল্ডার এটিকে অভ্যন্তরীণভাবে যেকোনভাবে ব্যবহার করে। এটি কি ইমেজলডার এর ক্যাশে সমর্থন ব্যতীত গুরুত্বপূর্ণ কিছু মিস করে?

ImageView mImageView;
String url = "http://i.imgur.com/7spzG.png";
mImageView = (ImageView) findViewById(R.id.myImage);
...

// Retrieves an image specified by the URL, displays it in the UI.
mRequestQueue = Volley.newRequestQueue(context);;
ImageRequest request = new ImageRequest(url,
  new Response.Listener() {
      @Override
      public void onResponse(Bitmap bitmap) {
          mImageView.setImageBitmap(bitmap);
      }
  }, 0, 0, null,
  new Response.ErrorListener() {
      public void onErrorResponse(VolleyError error) {
          mImageView.setImageResource(R.drawable.image_load_error);
      }
  })   {
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> params = new Map<String, String>();
        params.put("User-Agent", "one");
        params.put("header22", "two");

        return params;
    };
mRequestQueue.add(request);

আপনি যদি প্রশ্নটি কেন ভুল বলে মনে করেন বা জিজ্ঞাসা করা সমাধানে সমস্যা রয়েছে কেন আপনি যদি সেটাকে কেবল '' -১ 'দিয়ে দেন তবে আপনি এটি প্রশংসিত এবং আরও সহায়ক হবেন।
ল্যানিফ

1
মানচিত্র বিমূর্ত। হ্যাশম্যাপ হওয়া উচিত
সুপারসার্ডো

4

এটা চেষ্টা কর

{
    @Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           String bearer = "Bearer ".concat(token);
            Map<String, String> headersSys = super.getHeaders();
            Map<String, String> headers = new HashMap<String, String>();
            headersSys.remove("Authorization");
            headers.put("Authorization", bearer);
            headers.putAll(headersSys);
            return headers;
       }
};

4

আপনি একটি কাস্টম রিকোয়েস্ট ক্লাস করতে পারেন যা স্ট্রিংরয়েস্টকে প্রসারিত করতে পারে এবং এর মধ্যে getHeilers () পদ্ধতিটি এর ওভাররাইড করে:

public class CustomVolleyRequest extends StringRequest {

    public CustomVolleyRequest(int method, String url,
                           Response.Listener<String> listener,
                           Response.ErrorListener errorListener) {
        super(method, url, listener, errorListener);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<>();
        headers.put("key1","value1");
        headers.put("key2","value2");
        return headers;
    }
}

1
public class CustomJsonObjectRequest  extends JsonObjectRequest
{
    public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest,Response.Listener listener, Response.ErrorListener errorListener)
    {
        super(method, url, jsonRequest, listener, errorListener);
    }


@Override
public Map getHeaders() throws AuthFailureError {
    Map headers = new HashMap();
    headers.put("AppId", "xyz");

    return headers;
}

}

1

অতিরিক্ত হিসাবে আমি এর সাথে পাওয়া কিছু খুঁজে পেতে চাই Content-Type: শীর্ষে

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
.
.
.
return params;
}

আমাকে যোগ করতে হয়েছিল:

@Override
public String getBodyContentType() {
return /*(for exmaple)*/ "application/json";
}

কেন আমাকে জিজ্ঞাসা করবেন না, আমি কেবল ভেবেছিলাম এটি হয়ত অন্য কিছুকে সাহায্য করবে যা Content-Typeসেটটি সঠিকভাবে পেতে পারে না ।


0

এখানে গিথুব নমুনা থেকে শিরোনাম সেট করা হচ্ছে:

StringRequest myReq = new StringRequest(Method.POST,
                       "http://ave.bolyartech.com/params.php",
                        createMyReqSuccessListener(),
                        createMyReqErrorListener()) {

 protected Map<String, String> getParams() throws 
         com.android.volley.AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("param1", num1);
                        params.put("param2", num2);
                        return params;
                    };
                };
                queue.add(myReq);

0

এটা চেষ্টা কর

 public void VolleyPostReqWithResponseListenerwithHeaders(String URL,final Map<String, String> params,final Map<String, String> headers,Response.Listener<String> responseListener) {


    String url = URL;

    Log.i("url:", ":" + url);
    StringRequest mStringRequest = new StringRequest(Request.Method.POST,
            url, responseListener, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // error


            //Log.d("Error.Response", error.getLocalizedMessage());
        }
    }){
        @Override
        protected Map<String, String> getParams() {
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return headers;
        }
    };



    mStringRequest.setRetryPolicy(new DefaultRetryPolicy(
            60000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    mStringRequest.setShouldCache(true);



    //  dialog.show();
    SingletonRequestQueue.getInstance(context).addToRequestQueue(mStringRequest);
}

@ ওভাররাইড সার্বজনীন মানচিত্র <স্ট্রিং, স্ট্রিং> গেটহাইডারস () এথফয়েলচার এয়ার ror রিটার্ন শিরোনাম; }};
ওসামা ইব্রাহিম

হেডার Wheres ??
ওসামা ইব্রাহিম

Signutare উপর, আপনি এটি সেট করতে পারেন যখন আপনি মানচিত্র <STRING, STRING> হেডার কল
Yigit Yuksel

0

এটি আমার কোড, ভুলে যাবেন না = অবজেক্ট: যদি না ফেলে কাজ করে না

val queue = Volley.newRequestQueue(this)
        val url = "http://35.237.133.137:8080/lamarrullaWS/rest/lamarrullaAPI"
        // Request a string response from the provided URL.
        val jsonObjectRequest = object: JsonObjectRequest(Request.Method.GET, url, null,
                Response.Listener { response ->
                    txtPrueba.text = "Response: %s".format(response.toString())
                },
                Response.ErrorListener { txtPrueba.text = "That didn't work!" }
        )
        {
            @Throws(AuthFailureError::class)
            override fun getHeaders(): Map<String, String> {
                val headers = HashMap<String, String>()
                headers.put("Content-Type", "application/json")
                return headers
            }
        }
        queue.add(jsonObjectRequest)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.