मेरे पास कई यूआरएल और विभिन्न HTTP विधियों जैसे POST
, GET
, PUT
, DELETE
, आदि कुछ अनुरोधों में हेडर डेटा होता है जबकि कुछ में बॉडी होती है, कुछ में दोनों हो सकते हैं। मैं एक AsyncTask
कक्षा का उपयोग कर रहा हूं जिसमें कई रचनाकारों के साथ गतिविधियां हैं, जिन्हें मैं HttpUrlConnection
उदाहरण में जोड़ सकता हूं।मैं HttpUrlConnection के तर्क को कई तरीकों से कैसे विभाजित कर सकता हूं?
मैंने इस ट्यूटोरियल की कोशिश की: http://cyriltata.blogspot.in/2013/10/android-re-using-asynctask-class-across.html।
लेकिन उपरोक्त ट्यूटोरियल HttpClient
और NameValuePair
का उपयोग करता है। मैंने NameValuePair
को Pair
के साथ बदल दिया। लेकिन मुझे HttpUrlConnection
का उपयोग करके उसी तर्क को लागू करना मुश्किल लगता है क्योंकि मुझे अपने अनुरोध पर एकाधिक POST
डेटा और शीर्षलेख जोड़ने की आवश्यकता है।
लेकिन वापस स्ट्रिंग खाली है। मैं इस परिदृश्य को सही ढंग से कैसे कार्यान्वित करूं?
पूर्ण कोड:
public class APIAccessTask extends AsyncTask<String,Void,String> {
URL requestUrl;
Context context;
HttpURLConnection urlConnection;
List<Pair<String,String>> postData, headerData;
String method;
int responseCode = HttpURLConnection.HTTP_NOT_FOUND;
APIAccessTask(Context context, String requestUrl, String method){
this.context = context;
this.method = method;
try {
this.requestUrl = new URL(requestUrl);
}
catch(Exception ex){
ex.printStackTrace();
}
}
APIAccessTask(Context context, String requestUrl, String method, List<Pair<String,String>> postData,){
this(context, requestUrl, method);
this.postData = postData;
}
APIAccessTask(Context context, String requestUrl, String method, List<Pair<String,String>> postData,
List<Pair<String,String>> headerData){
this(context, requestUrl,method,postData);
this.headerData = headerData;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
setupConnection();
if(method.equals("POST"))
{
return httpPost();
}
if(method.equals("GET"))
{
return httpGet();
}
if(method.equals("PUT"))
{
return httpPut();
}
if(method.equals("DELETE"))
{
return httpDelete();
}
if(method.equals("PATCH"))
{
return httpPatch();
}
return null;
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(context,result,Toast.LENGTH_LONG).show();
super.onPostExecute(result);
}
void setupConnection(){
try {
urlConnection = (HttpURLConnection) requestUrl.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setChunkedStreamingMode(0);
if(headerData != null){
for (Pair pair: headerData)
{
urlConnection.setRequestProperty(pair.first.toString(), Base64.encodeToString(pair.second.toString().getBytes(),Base64.DEFAULT));
}
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
private String httpPost(){
try{
urlConnection.setRequestMethod("POST");
}
catch (Exception ex){
ex.printStackTrace();
return stringifyResponse();
}
String httpGet(){
try{
urlConnection.setRequestMethod("GET");
}
catch (Exception ex){
ex.printStackTrace();
}
return stringifyResponse();
}
String httpPut(){
try{
urlConnection.setRequestMethod("PUT");
}
catch (Exception ex){
ex.printStackTrace();
}
return stringifyResponse();
}
String httpDelete(){
try{
urlConnection.setRequestMethod("DELETE");
}
catch (Exception ex){
ex.printStackTrace();
}
return stringifyResponse();
}
String httpPatch(){
try{
urlConnection.setRequestMethod("PATCH");
}
catch (Exception ex){
ex.printStackTrace();
}
return stringifyResponse();
}
String stringifyResponse() {
StringBuilder sb = new StringBuilder();
try {
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
writer.write(getQuery(postData));
writer.flush();
writer.close();
out.close();
urlConnection.connect();
responseCode = urlConnection.getResponseCode();
if (responseCode == 200) {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return sb.toString();
}
private String getQuery(List<Pair<String,String>> params) throws UnsupportedEncodingException{
Uri.Builder builder = null;
for (Pair pair : params)
{
builder = new Uri.Builder()
.appendQueryParameter(pair.first.toString(), pair.second.toString());
}
return builder.build().getEncodedQuery();
}
}
क्या आप अपना कोड जोड़ सकते हैं जहां आप अपने अनुरोध में एकाधिक पोस्ट डेटा जोड़ने की कोशिश कर रहे हैं। –
आप जो पूछ रहे हैं उसे अस्पष्ट करें। एकाधिक POST नाम-मूल्य जोड़े या हेडर जोड़ने के लिए आपको कई विधियों की आवश्यकता नहीं है। – EJP
आईएमओ, आपकी आवश्यकता के लिए, आप Google वॉली के स्रोत कोड का संदर्भ ले सकते हैं, जो 'HurCStction.java] पर' setConnectionParametersForRequest' से शुरू होता है (https://android.googlesource.com/platform/frameworks/volley/+/master/src/ मुख्य/जावा/कॉम/एंड्रॉइड/वॉली/टूलबॉक्स/HurlStack.java) – BNK