প্রতিক্রিয়া নেটিভ এ ফেচ সহ একটি অনুমোদনের শিরোনাম ব্যবহার করা


141

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

আমার এখন পর্যন্ত যা আছে তা এখানে:

var Products = React.createClass({
  getInitialState: function() {
    return {
      clientToken: false,
      loaded: false
    }
  },
  componentWillMount: function () {
    fetch(api.token.link, api.token.object)
      .then((response) => response.json())
      .then((responseData) => {
          console.log(responseData);
        this.setState({
          clientToken: responseData.access_token,
        });
      })
      .then(() => {
        this.getPosts();
      })
      .done();
  },
  getPosts: function() {
    var obj = {
      link: 'https://api.producthunt.com/v1/posts',
      object: {
        method: 'GET',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
          'Authorization': 'Bearer ' + this.state.clientToken,
          'Host': 'api.producthunt.com'
        }
      }
    }
    fetch(api.posts.link, obj)
      .then((response) => response.json())
      .then((responseData) => {
        console.log(responseData);
      })
      .done();
  },

আমার কোড সম্পর্কে আমার যে প্রত্যাশা রয়েছে তা হ'ল:

  1. প্রথমত, আমি fetchআমার আমদানি করা API মডিউল থেকে ডেটা দিয়ে অ্যাক্সেস টোকেন করব will
  2. এর পরে, আমি প্রাপ্ত অ্যাক্সেস টোকেনটির সমান clientTokenসম্পত্তি নির্ধারণ করব this.state
  3. তারপরে, আমি চালাব getPostsযা প্রোডাক্ট হান্ট থেকে বর্তমান পোস্টগুলির একটি অ্যারে যুক্ত প্রতিক্রিয়া ফিরিয়ে আনবে ।

অ্যাক্সেস টোকেনটি গ্রহণ করা হচ্ছে এবং this.stateএটি এর clientTokenসম্পত্তি হিসাবে এটি পাচ্ছে তা আমি যাচাই করতে সক্ষম হয়েছি । getPostsযা চালানো হচ্ছে তা যাচাই করতেও আমি সক্ষম ।

আমি যে ত্রুটিটি পেয়েছি তা হ'ল:

error "ত্রুটি": "অননুমোদিত_আউথ", "ত্রুটি_সংশ্লিষ্ট": "দয়া করে একটি বৈধ অ্যাক্সেস টোকেন সরবরাহ করুন ap "ব্যক্তিগত শেষ পয়েন্টগুলি অ্যাক্সেস করার জন্য" "

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


2
এই এসও-তে উল্লিখিত হিসাবে , শিরোনামগুলি ছোট হাতের অক্ষরে পরিণত হওয়ার উদ্দেশ্যে করা হয় (কিছু সার্ভার এটি সম্মান করে, অন্যরা তা পছন্দ করে না)) আমি কেবল ভাগ করি কারণ এটি নিজেকে না জেনে আমার দ্বারা কামড়েছিল (এবং ইস্যুটি ডিবাগ করার চেষ্টা করা সময় নষ্ট করা)) এটি দুর্ভাগ্যজনক যে এতগুলি প্রকল্প, উদাহরণ এবং নিবন্ধগুলি এটিকে সম্মান করে বলে মনে হয় না।
tj

@tj শিরোনামের নামগুলি সংবেদনশীল নয় এবং আপনার লিঙ্ক করা প্রশ্নের উপরে গ্রহণযোগ্য + শীর্ষ উত্তরটি ঠিক তাই বলে।
মূল আগাম

উত্তর:


195

অনুমোদনের শিরোনামের সাথে উদাহরণস্বরূপ:

fetch('URL_GOES_HERE', { 
   method: 'post', 
   headers: new Headers({
     'Authorization': 'Basic '+btoa('username:password'), 
     'Content-Type': 'application/x-www-form-urlencoded'
   }), 
   body: 'A=1&B=2'
 });

4
এটি আমার জন্য কাজ করছে না। 'Authorization'হেডার চুপটি Firebug প্রতি সংযুক্ত করতে ব্যর্থ। এমনকি আমি tried credentials: 'include'চ্ছিক অবজেক্টটি অন্তর্ভুক্ত করার চেষ্টা করেছি ।
রনি রয়স্টন

7
@ রনরস্টন আপনি কি অপশন কল দেখছেন? যদি API এর এন্ডপয়েন্টটিতে CORS সক্ষম না থাকে (অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স: * যদি কোনও অন্য ডোমেন থেকে অ্যাক্সেস করা থাকে), তবে এটি অপশন কলটিতে ব্যর্থ হতে পারে।
কোডি মনিজ

1
এপিআই এন্ডপয়েন্টে করস সক্ষম নেই, তাই সম্ভবত এটি আমার পক্ষে কাজ করে নি work ধন্যবাদ। আমি ফায়ারফক্সের জন্য অ্যাড-অন 'সর্বত্র কর্স ইনস্টল' করেছি এবং এটি কার্যকর হয়েছে।
রনি রয়স্টন

3
@ রনরস্টন যে সমস্যাটি দেখছেন তা পুনরায় দেখুন, আপনাকে বটোয়া লাইব্রেরি আমদানি করতে হবে যা নোডের স্থানীয় নয়। (এটি ব্রাউজার লাইবের একটি বন্দর)) অন্যথায় লেখক শিরোনামটি নিঃশব্দে ব্যর্থ হয়। আমরা একই জিনিস অভিজ্ঞতা ছিল।
ফ্রিওয়াকার


67

দেখা যাচ্ছে, আমি fetchপদ্ধতিটি ভুলভাবে ব্যবহার করছিলাম ।

fetch দুটি পরামিতি প্রত্যাশা করে: এপিআই-এর একটি শেষ পয়েন্ট এবং একটি optionচ্ছিক বস্তু যা বডি এবং শিরোলেখ থাকতে পারে।

আমি দ্বিতীয় বস্তুর মধ্যে উদ্দেশ্যযুক্ত জিনিসটি মোড়ানো ছিলাম, যা আমার কোনও পছন্দসই ফলাফল পায়নি।

এটি কীভাবে একটি উচ্চ স্তরের দেখায়:

fetch('API_ENDPOINT', OBJECT)  
  .then(function(res) {
    return res.json();
   })
  .then(function(resJson) {
    return resJson;
   })

আমি আমার অবজেক্টটি এমনভাবে গঠন করেছি:

var obj = {  
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Origin': '',
    'Host': 'api.producthunt.com'
  },
  body: JSON.stringify({
    'client_id': '(API KEY)',
    'client_secret': '(API SECRET)',
    'grant_type': 'client_credentials'
  })

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

2
সম্পন্ন, আশা করি এটি সহায়ক
রিচার্ড খো

1
ওহ আমি সেই উদাহরণটি সহ আপনার ব্যক্তিগত সাইটে থাকি! আমি প্রথমবার আমার মডেলিং করেছি যদিও আমি আমার সমস্যাটি বের করেছিলাম, এটি কেবলমাত্র আমার ইউআরএলটি ভুল ছিল। এটির /শেষে
এমনটি দরকার

1
ধন্যবাদ, এটি সহায়ক ছিল। লক্ষণীয় যে, আনার নথিভুক্তিতে উল্লেখ করা হয়েছে যে ফেচ কুকিজগুলি পরিচালনা করে না, আপনি নিজেও এই কোড সহ শিরোনামে কুকিজ যুক্ত করতে পারেন। কেবল ইউড এবং কীটি সংরক্ষণ করুন এবং এর মতো কিছু করুন: var obj = {পদ্ধতি: 'GET', শিরোনাম: Ac 'স্বীকৃতি': 'অ্যাপ্লিকেশন / জেসন', 'সামগ্রী-প্রকার': 'অ্যাপ্লিকেশন / জেসন', 'কুকি': 'ইউআইডি = + ইউআইডি + +'; কী = '+ কী});
ডাস্টিন

8

আমার এই অভিন্ন সমস্যাটি ছিল, আমি প্রমাণীকরণ টোকেনগুলির জন্য জ্যাঙ্গো-রেস্ট-নক্স ব্যবহার করছিলাম। দেখা যাচ্ছে যে আমার আনার পদ্ধতিতে কিছুই ভুল ছিল না যা দেখতে এই জাতীয় দেখাচ্ছে:

...
    let headers = {"Content-Type": "application/json"};
    if (token) {
      headers["Authorization"] = `Token ${token}`;
    }
    return fetch("/api/instruments/", {headers,})
      .then(res => {
...

আমি আপাচে চলছিলাম।

আমার জন্য এই সমস্যার সমাধান পরিবর্তন ছিল WSGIPassAuthorizationথেকে 'On'wsgi.conf

আমার AWS ইসি 2 তে একটি জ্যাঙ্গো অ্যাপ স্থাপন ছিল এবং আমি আমার অ্যাপ্লিকেশন পরিচালনা করতে ইলাস্টিক বিয়ানস্টক ব্যবহার করেছি, সুতরাং django.configআমি এই কাজটি করেছি:

container_commands:
  01wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'

0
completed = (id) => {
    var details = {
        'id': id,

    };

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

    fetch(markcompleted, {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: formBody
    })
        .then((response) => response.json())
        .then((responseJson) => {
            console.log(responseJson, 'res JSON');
            if (responseJson.status == "success") {
                console.log(this.state);
                alert("your todolist is completed!!");
            }
        })
        .catch((error) => {
            console.error(error);
        });
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.