জসনপি-তে ডেটা পোস্ট করুন


102

জাসনপিতে ডেটা পোস্ট করা কি সম্ভব? বা জিইটি রিকোয়েস্ট হিসাবে সমস্ত ডেটা কিউরিস্ট্রিংয়ে পাস করতে হবে?

আমার কাছে প্রচুর ডেটা রয়েছে যা আমার পরিষেবাতে, ক্রস ডোমেনে প্রেরণ করা দরকার, এবং ক্যোয়ারিং স্ট্রিংয়ের মাধ্যমে প্রেরণ করা খুব বড় is

এই কাছাকাছি পেতে বিকল্পগুলি কি কি?

উত্তর:


83

একই উত্স নীতিটিরPOST (যথেষ্ট বুদ্ধিমান) সীমাবদ্ধতার কারণে অন্য ডোমেনের কোনও পরিষেবায় একটি অ্যাসিনক্রোনাস করা সম্ভব নয় । JSON-P কেবলমাত্র কাজ করে কারণ আপনাকে ডোমটিতে ট্যাগ .োকানোর অনুমতি দেওয়া হয়েছে এবং তারা যে কোনও জায়গায় নির্দেশ করতে পারে।<script>

আপনি অবশ্যই অন্য ডোমেনে একটি পৃষ্ঠা তৈরি করতে পারেন নিয়মিত ফর্ম পোষ্টের ক্রিয়া।

সম্পাদনা করুন : যদি আপনি লুকিয়ে থাকা সন্নিবেশ করানো এবং তাদের বৈশিষ্ট্যগুলি নিয়ে মাতামাতি করার প্রচেষ্টায় যেতে চান তবে সেখানে কিছু আকর্ষণীয় হ্যাক রয়েছে <iframe>


আপনি উল্লেখ করেছেন যে একটি "অ্যাসিনক্রোনাস পোষ্ট" সম্ভব নয় .... তাহলে আমি কি একটি সিঙ্ক্রোনাস পোস্ট করতে পারি?
চিহ্নিত করুন

4
@ চিহ্ন "সিঙ্ক্রোনাস পোষ্ট" অর্থ একটি ফর্ম জমা দেওয়া যা <ফর্ম পদ্ধতি = "পোস্ট" ক্রিয়া = "http: // ... / ..."> ব্যবহার করে
স্টিভেন ক্রাইস্কাল্লা

8
এটি বেশ সত্য নয়। আপনি অবশ্যই POSTডোমেন এবং আপনার ব্রাউজার উভয় সমর্থন হিসাবে অন্য ডোমেনগুলিতে অনুরোধ করতে পারেন CORS। তবে এটি সম্পূর্ণ সত্য POSTএবং JSONPউপযুক্ত নয়।
হিপ্পিট্রেইল

2
<script>অন্য কোনও ডোমেনের দিকে নির্দেশ করে এমন ট্যাগগুলি সন্নিবেশ করে জেএসএনপি বাস্তবায়ন করা হয় । ব্রাউজারে POST অনুরোধগুলি সম্পাদন করার একমাত্র উপায় হ'ল এইচটিএমএল ফর্ম বা এক্সএমএলএইচটিপিআরকোয়েস্টের মাধ্যমে।
ফ্রাইডো

1
(সাধারণভাবে -) অন্য ডোমেনের পরিষেবাতে একটি অ্যাসিনক্রোনাস পোষ্ট করা সম্ভব (!)) সীমাবদ্ধতা প্রতিক্রিয়া হয়। সীমাবদ্ধতা জেএসওএনপি অনুরোধেও রয়েছে।
রই নমির

20

আপনার যদি প্রচুর ডেটা ক্রস-ডোমেন প্রেরণের দরকার হয়। আমি সাধারণত একটি পরিষেবা তৈরি করি যা আপনি দুটি ধাপে কল করতে পারেন:

  1. প্রথমে ক্লায়েন্ট একটি ফোরাম জমা দিন (পোস্ট অনুমোদিত ক্রস ডোমেন)। পরিষেবাটি সার্ভারে সেশনে ইনপুটটি সঞ্চয় করে (জিইউইডি কী হিসাবে ব্যবহার করে)। (ক্লায়েন্ট একটি জিইউইডি তৈরি করে এবং এটি ইনপুটটির অংশ হিসাবে প্রেরণ করে)

  2. তারপরে ক্লায়েন্টটি প্যারামিটার হিসাবে একটি সাধারণ স্ক্রিপ্ট-ইনজেকশন (জেএসওএনপি) করেন যা আপনি ফর্ম পোস্টে ব্যবহার করেছেন সেই একই জিআইডি ব্যবহার করেন। পরিষেবাটি সেশন থেকে ইনপুটটি প্রক্রিয়া করে এবং সাধারণ জেএসএনপি-ফ্যাশনে ডেটা দেয় returns এর পরে অধিবেশনটি নষ্ট হয়ে যায়।

এটি অবশ্যই নির্ভর করে যে আপনি সার্ভার-ব্যাকএন্ড লিখেছেন।


1
আপনার অ্যাপ্রোচ চেষ্টা করেছেন। FF14 এবং Chrome20 এর জন্য কাজ করেছেন Wor অপেরা 11 এবং আই 9 কেবল পোস্টটি স্থানান্তর করেনি। (এটি তাদের ডিবাগ সরঞ্জামগুলির সাহায্যে পরীক্ষা করা হয়েছে এবং অন্য প্রান্তে সার্ভারে শুনেছেন) আইই এর অক্ষমতার সাথে সম্পর্কিত এই প্রশ্নটি হতে পারে: স্ট্রোকভারফ্লো / প্রশ্নগুলি ১০০৯৯০৮০৩/২ কনসোলে ক্রোমের অভিযোগ, তবে এখনও পোস্টটি করেছে: এক্সএমএলএইচটিপিআরকেস্ট করতে পারে না লোকালহোস্ট লোড করুন : 8080 / এক্সএক্সএক্সএক্স অরিজিন নাল অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স দ্বারা অনুমোদিত নয়।
ওয়ানওয়ার্ল্ড

@ ওনওয়ার্ল্ড - উত্তরটি যা বলেছে আপনি তা করেননি। XMLHttpRequestমোটেই জড়িত হওয়া উচিত নয়। পার এর উত্তর পোস্টের অনুরোধটি করার জন্য নিয়মিত ফর্ম জমা ব্যবহার করে, তারপরে জিইটি অনুরোধ করার জন্য একটি স্ক্রিপ্ট উপাদান ইঞ্জেকশন।
কোয়ান্টিন

7

আমি জানি যে এটি গুরুতর প্রকৃতির, তবে আমি ভেবেছিলাম যে আমি JSONP POST এর প্রয়োগটি jQuery ব্যবহার করে পোস্ট করব, যা আমি আমার জেএস উইজেটের জন্য সফলভাবে ব্যবহার করছি (এটি গ্রাহক নিবন্ধকরণ এবং লগইনের জন্য ব্যবহৃত হয়):

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

আমি আশা করি যে কেউ এটির কাজে লাগবে। > = আই 8, ক্রোম, ফায়ারফক্স এবং সাফারি পরীক্ষিত।

function JSONPPostForm(form, postUrl, queryStatusUrl, queryStatusSuccessFunc, queryStatusData)
{
    var tmpDiv = $('<div style="display: none;"></div>');
    form.parent().append(tmpDiv);
    var clonedForm = cloneForm(form);
    var iframe = createIFrameWithContent(tmpDiv, clonedForm);

    if (postUrl)
        clonedForm.attr('action', postUrl);

    var postToken = 'JSONPPOST_' + (new Date).getTime();
    clonedForm.attr('id', postToken);
    clonedForm.append('<input name="JSONPPOSTToken" value="'+postToken+'">');
    clonedForm.attr('id', postToken );
    clonedForm.submit();

    var timerId;
    var watchIFrameRedirectHelper = function()
    {
        if (watchIFrameRedirect(iframe, postToken ))
        {
            clearInterval(timerId);
            tmpDiv.remove();
            $.ajax({
                url:  queryStatusUrl,
                data: queryStatusData,
                dataType: "jsonp",
                type: "GET",
                success: queryStatusSuccessFunc
            });
        }
    }

    if (queryStatusUrl && queryStatusSuccessFunc)
        timerId = setInterval(watchIFrameRedirectHelper, 200);
}

function createIFrameWithContent(parent, content)
{
    var iframe = $('<iframe></iframe>');
    parent.append(iframe);

    if (!iframe.contents().find('body').length)
    {
        //For certain IE versions that do not create document content...
        var doc = iframe.contents().get()[0];
        doc.open();
        doc.close();
    }

    iframe.contents().find('body').append(content);
    return iframe;
}

function watchIFrameRedirect(iframe, formId)
{
    try
    {
        if (iframe.contents().find('form[id="' + formId + '"]').length)
            return false;
        else
            return true;
    }
    catch (err)
    {
        return true;
    }
    return false;
}

//This one clones only form, without other HTML markup
function cloneForm(form)
{
    var clonedForm = $('<form></form>');
    //Copy form attributes
    $.each(form.get()[0].attributes, function(i, attr)
    {
        clonedForm.attr(attr.name, attr.value);
    });
    form.find('input, select, textarea').each(function()
    {
        clonedForm.append($(this).clone());
    });

    return clonedForm;
}

4

ভাল সাধারণত জেএসওএনপি <script>কলিং ডকুমেন্টে একটি ট্যাগ যুক্ত করে প্রয়োগ করা হয় , যেমন JSONP পরিষেবার URL টি "src" " ব্রাউজারটি একটি HTTP জিইটি লেনদেনের সাথে স্ক্রিপ্ট উত্সটি নিয়ে আসে।

এখন, যদি আপনার JSONP পরিষেবাটি আপনার কলিং পৃষ্ঠার একই ডোমেনে থাকে, তবে আপনি সম্ভবত একটি সাধারণ $.ajax()কল দিয়ে কিছু মিলিয়ে দেখতে পারেন । যদি এটি একই ডোমেইনে না থাকে, তবে কীভাবে এটি সম্ভব হবে তা আমি নিশ্চিত নই।


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

2
যদি এটি একই ডোমেনে না থাকে তবে এটি সমর্থন করে CORSতবে ব্রাউজারটি যতক্ষণ সমর্থন করে ততক্ষণ এটি সম্ভব হবে। এই ক্ষেত্রে আপনি JSONপরিবর্তে প্লেইন ব্যবহার করবেন JSONP
হিপ্পিট্রাইল

হ্যাঁ, @hippietrail 2 বছর একটি বড় পার্থক্য করে :-) CORS অবশ্যই এটি সম্ভব করে তোলে, তবে অবশ্যই এটির জন্য ডেটা উত্সটি যথাযথভাবে সেট আপ করা দরকার।
পয়েন্টি

0

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


-1

এর একটি (হ্যাক) সমাধান রয়েছে যা আমি এটি বহুবার করেছি, আপনি জসনপি দিয়ে পোস্ট করতে সক্ষম হবেন। (আপনি জিইটি দ্বারা ব্যবহারের চেয়ে 2000 চরের চেয়ে বড় ফর্ম পোস্ট করতে সক্ষম হবেন)

ক্লায়েন্ট অ্যাপ্লিকেশন জাভাস্ক্রিপ্ট

$.ajax({
  type: "POST", // you request will be a post request
  data: postData, // javascript object with all my params
  url: COMAPIURL, // my backoffice comunication api url
  dataType: "jsonp", // datatype can be json or jsonp
  success: function(result){
    console.dir(result);
  }
});

জাভা:

response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client 
response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post
response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout

পিএইচপি:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');

এটি করে আপনি কোনও সার্ভারের অনুরোধের জন্য আপনার সার্ভারটি খুলছেন, আপনাকে পরিচয় বা অন্য কিছু সরবরাহ করে এটি পুনরায় সুরক্ষিত করা উচিত।

এই পদ্ধতির সাহায্যে আপনি অনুরোধের প্রকারটি jsonp থেকে json এ পরিবর্তন করতে পারেন, উভয়ই কাজ করেন, কেবল সঠিক প্রতিক্রিয়া সামগ্রী প্রকার সেট করুন

jsonp

response.setContentType( "text/javascript; charset=utf-8" );

JSON

response.setContentType( "application/json; charset=utf-8" );

আপনি সার্ভার আর এসওপি (একই উত্স নীতি) সম্মান করবে না দয়া করে, কিন্তু কে যত্ন?


এটি সিওআরএস সহ আজেএক্স নয়। AJAX বোঝায় যে আপনি এক্সএমএল ব্যবহার করছেন। এটি সিওআরএস সহ জেএসএন [পি]। জেএসএনপি হ'ল "জেএসওএন" "প্যাডিং"। যদি এটি জেএসএন ডেটা প্রেরণ করে, প্যাডিংয়ের জন্য একটি ফাংশন কল দিয়ে আবৃত, তবে এটি সিওআরএস সহ জেএসএনপি P আপনি <script>আপনার এইচটিএমএল ডিওমে কেবল ইনজেকশন ট্যাগের বাইরে জেএসএন এবং জেএসএনপি উভয় ডেটা নোটেশন ব্যবহার করতে পারেন (হ্যাক আপনি এমনকি এটি কোনও ডেস্কটপ অ্যাপ্লিকেশনগুলিতে ব্যবহার করতে পারেন, বলুন যে আপনি একই সার্ভারে একাধিক জেএসএন অনুরোধ করতে চেয়েছিলেন, এবং ফাংশনটির নামটি ব্যবহার করতে চেয়েছিলেন উদাহরণস্বরূপ একটি অনুরোধ ট্র্যাকিং আইডি হিসাবে)।
BrainSlugs83

-6

এটা সম্ভব, এখানে আমার সমাধান:

আপনার জাভাস্ক্রিপ্টে:

jQuery.post("url.php",data).complete(function(data) {
    eval(data.responseText.trim()); 
});
function handleRequest(data){
    ....
}

আপনার url.php এ:

echo "handleRequest(".$responseData.")";

11
এই ক্ষেত্রে jQuery সম্ভবত আপনার অনুরোধগুলি তাদের ডকুমেন্টেশন অনুসারে পান রূপান্তরিত করে: দ্রষ্টব্য: এটি দূরবর্তী-ডোমেন অনুরোধের জন্য পোষ্টগুলিকে জিইটিগুলিতে পরিণত করবে। api.jquery.com/jQuery.ajax
ওয়ান ওয়ার্ল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.