मैं Fetch का उपयोग करके x-www-form-urlencoded अनुरोध कैसे पोस्ट कर सकता हूं?


111

मेरे पास कुछ पैरामीटर हैं, जिन्हें मैं अपने सर्वर पर पोस्ट-एनकोडेड करना चाहता हूं:

{
    'userName': 'test@gmail.com',
    'password': 'Password!',
    'grant_type': 'password'
}

मैं इस तरह अपना अनुरोध (वर्तमान में मापदंडों के बिना) भेज रहा हूं

var obj = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  },
};
fetch('https://example.com/login', obj)
  .then(function(res) {
    // Do stuff with result
  }); 

मैं अनुरोध में फ़ॉर्म-एन्कोड किए गए पैरामीटर कैसे शामिल कर सकता हूं?


3
कृपया अपने चयनित उत्तर को वास्तविक सही उत्तर पर अपडेट करें।
अल्बर्ट रेनशॉ

जवाबों:


-58

फॉर्म-एनकोडेड POST अनुरोध अपलोड करने के लिए, मैं फॉर्मडाटा ऑब्जेक्ट का उपयोग करने की सलाह देता हूं

उदाहरण कोड:

var params = {
    userName: 'test@gmail.com',
    password: 'Password!',
    grant_type: 'password'
};

var formData = new FormData();

for (var k in params) {
    formData.append(k, params[k]);
}

var request = {
    method: 'POST',
    headers: headers,
    body: formData
};

fetch(url, request);

86
यह एप्लिकेशन / x-www-form-urlencoded नहीं है, बल्कि मल्टीपार्ट / फॉर्म-डेटा
Haha TTpro

मैं सहमत हूं, इस अनुरोध में सामग्री-प्रकार के रूप में "अनुप्रयोग / x-www-www-form-urlencoded" लेकिन "मल्टीपार्ट / प्रपत्र-डेटा" नहीं होगा।
b4stien

2
@Mzn - उदाहरण के लिए, यदि आप Google की क्लोजर कंपाइलर API जैसी सेवा का उपयोग कर रहे हैं , तो सर्वर केवल स्वीकार करेगा application/x-www-form-urlencoded, नहीं multipart/form-data
स्फिंक्सएक्स

12
यह स्वीकृत उत्तर कैसे हो सकता है? वास्तविक प्रश्न के बारे में यह स्पष्ट गलत है ...
adबोजाद २४'१

1
फॉर्मडैट ऑब्जेक्ट सबमिट करते समय आपको सर्वर पर अतिरिक्त प्रसंस्करण करना होगा। मूल रूप से एक नियमित रूप से प्रक्रिया करें जैसे कि यह एक फ़ाइल अपलोड थी। नियमित रूपों के लिए फॉर्मडैट ऑब्जेक्ट्स का क्या फायदा है?
मार्सएंडबैक

266

आपको अपने आप को x-www-form-urlencoded पेलोड को एक साथ रखना होगा, जैसे:

var details = {
    'userName': 'test@gmail.com',
    'password': 'Password!',
    'grant_type': 'password'
};

var formBody = [];
for (var property in details) {
  var encodedKey = encodeURIComponent(property);
  var encodedValue = encodeURIComponent(details[property]);
  formBody.push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");

fetch('https://example.com/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
  },
  body: formBody
})

ध्यान दें कि यदि आप fetchप्रतिक्रियाशील मूल के बजाय एक (पर्याप्त रूप से आधुनिक) ब्राउज़र में उपयोग कर रहे थे , तो आप इसके बजाय एक URLSearchParamsऑब्जेक्ट बना सकते हैं और इसका उपयोग शरीर के रूप में कर सकते हैं, क्योंकि Fetch Standard यह बताता है कि यदि bodyकोई URLSearchParamsवस्तु है तो इसे क्रमबद्ध किया जाना चाहिए application/x-www-form-urlencoded। हालाँकि, आप इसे रिएक्ट नेटिव में नहीं कर सकते क्योंकि रिएक्टिव नेटिव लागू नहीं होता हैURLSearchParams


51
const formBody = Object.keys(details).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(details[key])).join('&');
ईएस

URLSearchParams github.com/WebReflection/url-search-params के लिए यह पॉलीफ़िल रिएक्टिव नेटिव या पुराने ब्राउज़र के लिए काम कर सकता है।
bucabay

7
इसी तरह का एक और तरीका:const formBody = Object.entries(details).map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value)).join('&')
फ्लिन

1
यह
जौन

मैंने सभी सुझाए गए तरीकों की कोशिश की है। कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, शरीर के चारों ओर अवांछित उद्धरणों को इंजेक्ट करता है, सीधे स्ट्रिंग में - उद्घाटन और समापन उद्धरण। इस कारण से परमों को पार्स किया जाता है, जैसे: '' '' म्याक '' '' मवल्लु ''। जिससे API को कॉल करना असंभव हो जाता है, क्योंकि इनका परिणाम केवल 400 त्रुटियों में होता है (सर्वर mykey को पहचानता है, "mykey नहीं)। किसी और को यह समस्या है? चौंकाने वाला है।
डेव मुंगेर


49

उपयोग URLSearchParams

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams

var data = new URLSearchParams();
data.append('userName', 'test@gmail.com');
data.append('password', 'Password');
data.append('grant_type', 'password');

यह वही करता है जो मैंने इरादा किया था, क्योंकि php7 फॉर्मडाटा एन्कोडिंग को सही नहीं कर रहा था। मुझे आशा है कि इसे PHP के लड़कों और लड़कियों के लिए अधिक वोट
मिलेंगे

6
-1; URLSearchParamsप्रतिक्रियाशील मूल में मौजूद नहीं है। (देखें github.com/facebook/react-native/issues/9596। )
मार्क एमी

3
यह अब रिएक्ट नेटिव का हिस्सा है। toString()अनुरोध को पारित करने से पहले डेटा पर कॉल करना सुनिश्चित करें body
फतमान

आरएन के यह कहने के बाद भी कि उन्होंने लागू किया है URLSearchParams, मुझे अभी भी समस्या है। मुझे नहीं लगता कि यह कल्पना के अनुसार लागू किया गया है और यह सिर्फ समाधान में कमी नहीं है। यदि आप छोड़ने की कोशिश करते हैं और अभी भी समस्या है तो कृपया URLSearchParams 'त्रुटि: लागू नहीं' पढ़ने पर विचार करें URLSearchParams
शून्य 298

14

बस यही किया था और UrlSearchParams ने चाल चली थी यहाँ मेरा कोड है अगर यह किसी की मदद करता है

import 'url-search-params-polyfill';
const userLogsInOptions = (username, password) => {



// const formData = new FormData();
  const formData = new URLSearchParams();
  formData.append('grant_type', 'password');
  formData.append('client_id', 'entrance-app');
  formData.append('username', username);
  formData.append('password', password);
  return (
    {
      method: 'POST',
      headers: {
        // "Content-Type": "application/json; charset=utf-8",
        "Content-Type": "application/x-www-form-urlencoded",
    },
      body: formData.toString(),
    json: true,
  }
  );
};


const getUserUnlockToken = async (username, password) => {
  const userLoginUri = `${scheme}://${host}/auth/realms/${realm}/protocol/openid-connect/token`;
  const response = await fetch(
    userLoginUri,
    userLogsInOptions(username, password),
  );
  const responseJson = await response.json();
  console.log('acces_token ', responseJson.access_token);
  if (responseJson.error) {
    console.error('error ', responseJson.error);
  }
  console.log('json ', responseJson);
  return responseJson.access_token;
};

5
*/ import this statement */
import qs from 'querystring'

fetch("*your url*", {
            method: 'POST',
            headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
            body: qs.stringify({ 
                username: "akshita",
                password: "123456",
            })
    }).then((response) => response.json())
      .then((responseData) => {
         alert(JSON.stringify(responseData))
    })

Npm i querystring --save का उपयोग करने के बाद यह ठीक काम करता है।


5
var details = {
    'userName': 'test@gmail.com',
    'password': 'Password!',
    'grant_type': 'password'
};

var formBody = [];
for (var property in details) {
  var encodedKey = encodeURIComponent(property);
  var encodedValue = encodeURIComponent(details[property]);
  formBody.push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");

fetch('http://identity.azurewebsites.net' + '/token', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: formBody
})

यह मेरे लिए बहुत उपयोगी है और बिना किसी त्रुटि के काम करता है

refrence: https://gist.github.com/milon87/f391e54e64e32e1626235d4dc4d16dc8


3

महज प्रयोग करें

import  qs from "qs";
 let data = {
        'profileId': this.props.screenProps[0],
        'accountId': this.props.screenProps[1],
        'accessToken': this.props.screenProps[2],
        'itemId': this.itemId
    };
    return axios.post(METHOD_WALL_GET, qs.stringify(data))

1
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। यह प्रयोग करने में आसान है और बनाने के लिए कोई अजीब सामान नहीं है।
अगस्तो गोंजालेज

3

JQuery का उपयोग करने की आवश्यकता नहीं है, querystringया मैन्युअल रूप से पेलोड को इकट्ठा करना है। URLSearchParamsजाने के लिए एक रास्ता है और यहाँ पूर्ण अनुरोध उदाहरण के साथ सबसे संक्षिप्त उत्तरों में से एक है:

fetch('https://example.com/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: new URLSearchParams({
    'param': 'Some value',
    'another_param': 'Another value'
  })
})
  .then(res => {
    // Do stuff with the result
  });

हां, आप इसके बजाय एक्सियोस या जो भी आप चाहते हैं, का उपयोग कर सकते हैं fetch

PS URLSearchParamsIE में समर्थित नहीं है।


2

बस शरीर को निम्नलिखित के रूप में सेट करें

var reqBody = "username="+username+"&password="+password+"&grant_type=password";

फिर

fetch('url', {
      method: 'POST',
      headers: {
          //'Authorization': 'Bearer token',
          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
      },
      body: reqBody
  }).then((response) => response.json())
      .then((responseData) => {
          console.log(JSON.stringify(responseData));
      }).catch(err=>{console.log(err)})

1

मूल उदाहरण में आपके पास एक transformRequestफ़ंक्शन है जो ऑब्जेक्ट को एन्कोडेड डेटा में कनवर्ट करता है।

संशोधित उदाहरण में आपने वह जगह ले ली है JSON.stringifyजिसके साथ एक वस्तु को JSON में परिवर्तित करता है।

आपके पास दोनों मामलों में आप दोनों मामलों में फ़ॉर्म एन्कोडेड डेटा भेजने का दावा'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' कर रहे हैं ।

इसके बजाय अपने फ़ॉर्म एन्कोडिंग फ़ंक्शन का उपयोग करें JSON.stringify


पुनः अपडेट करें:

अपने पहले fetchउदाहरण में, आप bodyJSON मान सेट करते हैं ।

अब आपने एक फॉर्म एनकोडेड संस्करण बनाया है, लेकिन bodyउस मूल्य को सेट करने के बजाय , आपने एक नई ऑब्जेक्ट बनाई है और उस ऑब्जेक्ट की संपत्ति के रूप में फॉर्म एनकोडेड डेटा सेट किया है।

वह अतिरिक्त वस्तु न बनाएं। बस के लिए अपने मूल्य निर्दिष्ट body


हाय @ क्वेंटिन। मैंने कोशिश की है कि भविष्य के पाठकों के लिए इसे अधिक उपयोगी संदर्भ में बनाने के लिए प्रश्न को मौलिक रूप से धीमा कर दिया जाए; ऐसा करने पर, मैंने आपके उत्तर को पूरी तरह से अमान्य कर दिया है जो कि प्रश्नकर्ता के मूल कोड के विवरण और बग को संदर्भित करता है। मुझे लगता है कि अगर आप चाहते हैं कि आपके संपादन को वापस करने का अधिकार आपके पास है - तो सिद्धांत रूप में, हम उत्तर-अमान्य संपादन संपादन करने के लिए नहीं हैं, जो कि मैंने किया है - लेकिन अगर आप इसके लिए तैयार हैं, तो मुझे लगता है कि इसके बजाय केवल इस उत्तर को हटाना बेहतर होगा; IMO प्रश्न कोणीय कोड या पिछले असफल प्रयास के बिना बहुत अच्छा है।
मार्क ऐमी

1

यदि आप JQuery का उपयोग कर रहे हैं, यह भी काम करता है ..

fetch(url, {
      method: 'POST', 
      body: $.param(data),
      headers:{
        'Content-Type': 'application/x-www-form-urlencoded'
      }
})

0

युक्ति के अनुसार , उपयोग करने encodeURIComponentसे आपको एक अनुरूप क्वेरी नहीं मिलेगी। य़ह कहता है:

  1. नियंत्रण नाम और मूल्य बच गए हैं। अंतरिक्ष वर्णों को प्रतिस्थापित किया जाता है+ , और फिर आरक्षित वर्णों को [RFC1738], खंड 2.2 में वर्णित किया जाता है, गैर-अल्फ़ान्यूमेरिक वर्णों द्वारा प्रतिस्थापित किया जाता है %HH, एक प्रतिशत चिह्न और वर्ण के ASCII कोड का प्रतिनिधित्व करने वाले दो हेक्साडेसिमल अंकों से बच जाते हैं । लाइन ब्रेक को "सीआर एलएफ" जोड़े (यानी, %0D%0A) के रूप में दर्शाया गया है ।
  2. नियंत्रण नाम / मूल्य दस्तावेज़ में दिखाई देने वाले क्रम में सूचीबद्ध हैं। नाम को मान से अलग किया जाता है =और नाम / मूल्य जोड़े एक दूसरे से अलग होते हैं &

समस्या यह है, encodeURIComponentरिक्त स्थान होना %20, नहीं +

फॉर्म-बॉडी को encodeURIComponentअन्य उत्तरों में दिखाए गए तरीकों की विविधता का उपयोग करके कोडित किया जाना चाहिए ।

const formUrlEncode = str => {
  return str.replace(/[^\d\w]/g, char => {
    return char === " " 
      ? "+" 
      : encodeURIComponent(char);
  })
}

const data = {foo: "bar߃©˙∑  baz", boom: "pow"};

const dataPairs = Object.keys(data).map( key => {
  const val = data[key];
  return (formUrlEncode(key) + "=" + formUrlEncode(val));
}).join("&");

// dataPairs is "foo=bar%C3%9F%C6%92%C2%A9%CB%99%E2%88%91++baz&boom=pow"

0

आप प्रतिक्रिया-मूल-आसान-ऐप का उपयोग कर सकते हैं जो http अनुरोध भेजने और अवरोधन अनुरोध तैयार करने में आसान है।

import { XHttp } from 'react-native-easy-app';

* Synchronous request
const params = {name:'rufeng',age:20}
const response = await XHttp().url(url).param(params).formEncoded().execute('GET');
const {success, json, message, status} = response;


* Asynchronous requests
XHttp().url(url).param(params).formEncoded().get((success, json, message, status)=>{
    if (success){
       this.setState({content: JSON.stringify(json)});
    } else {
       showToast(msg);
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.