এইচটিটিপি কনটেন্ট-টাইপ শিরোনাম এবং জেএসএন


144

আমি সবসময় এইচটিটিপি প্রোটোকলের বেশিরভাগ সম্পত্তি অজানা ভয়ের জন্য ব্যবহার করা এড়াতে চেষ্টা করে যাচ্ছি।

তবে আমি নিজেকে বলেছিলাম যে আমি আজ ভয়ের মুখোমুখি হতে চলেছি এবং উদ্দেশ্যমূলকভাবে শিরোনাম ব্যবহার করা শুরু করব start আমি jsonব্রাউজারে ডেটা প্রেরণ এবং এটি এখনই ব্যবহার করার চেষ্টা করছি । উদাহরণস্বরূপ, যদি আমার রেডি স্টেট 4 এজ্যাক্স হ্যান্ডলার ফাংশন থাকে যা দেখতে এরকম দেখাচ্ছে:

function ajaxHandler(response){
    alert(response.text);
}

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

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

হ্যান্ডলার ফাংশন থেকে কেন আমি সরাসরি সম্পত্তিটি অ্যাক্সেস করতে পারি না, যখন ব্রাউজারটি পরিষ্কারভাবে জানানো হয় যে ইনকামিং ডেটা application/json?


আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি textহ্যান্ডলারে জাভাস্ক্রিপ্ট ভেরিয়েবল হিসাবে ব্যবহার করতে চান এবং প্রতিক্রিয়া নয়? এটি খুব অদ্ভুত কার্যকারিতা হবে। Json_encode আপনার পিএইচপি অ্যারে থেকে 1 টি অবজেক্টও তৈরি করে। সুতরাং আপনি যখন এটি জাভাস্ক্রিপ্ট এ পাবেন এটি একটি ভেরিয়েবল বরাদ্দ করা প্রয়োজন।
ফ্ল্যাশিন

4
কনটেন্টটাইপ শিরোনাম কেবল তথ্য। ব্রাউজার যদি এটি পারে তবে এটি ব্যবহার করবে তবে এই ক্ষেত্রে ব্রাউজারগুলি কেবল এটিকে উপেক্ষা করে কারণ তারা সাধারণত জানেন না যে উদ্দেশ্যটি কী। আপনার জাভাস্ক্রিপ্ট আবেদন করতে পারেন এটা ব্যবহার করতে। আপনি ধরে নিচ্ছেন যে JSON উপস্থাপিত হবে, সুতরাং আপনি এটিকে ডিকোড করতে পারেন JSON.parse()। আপনি কিছু আলাদা পদক্ষেপ নিতে পারেন, বা ভুল কন্টেন্টটাইপ প্রদর্শিত হলে একটি ত্রুটি জোর করতে পারে।

1
ব্রাউজারটি স্বয়ংক্রিয়ভাবে আপনার জন্য JSON পাঠ্যকে বিশ্লেষণ করে না, response.textএখনও একটি স্ট্রিং।
nnnnnn

1
সুতরাং আপনি আমাকে বলতে চাইছেন যে শিরোলেখটি সেট করা কি এতদূর পার্থক্য করে না? তখন এর অস্তিত্বের উদ্দেশ্য কী?
php_nub_qq

2
@ পিএফপি_নুব_কিউ: সার্ভার কী ফিরিয়েছে তা আপনাকে জানানোই এর উদ্দেশ্য হ'ল যাতে আপনার অ্যাপ্লিকেশন সে অনুযায়ী এটি পরিচালনা করতে পারে। ব্রাউজার তোমার জন্য তাদেরকে JSON পার্স করা হবে না, আপনার অ্যাপ্লিকেশন যে কাজ করতে হবে। এই শিরোনামটি আপনাকে বলছে যে এটি (বা জেএসএন হওয়া উচিত)।
রকেট হাজমত

উত্তর:


136

Content-Typeহেডার শুধু আপনার অ্যাপ্লিকেশনের জন্য তথ্য হিসেবে ব্যবহৃত হয়। ব্রাউজারটি কী তা যত্ন করে না। ব্রাউজারটি আপনাকে কেবল এজাক্স কল থেকে ডেটা ফেরত দেয়। আপনি যদি এটি JSON হিসাবে পার্স করতে চান তবে আপনার নিজের এটি করা দরকার।

শিরোনামটি সেখানে রয়েছে তাই আপনার অ্যাপটি কোন ডেটা ফিরে এসেছে এবং এটি কীভাবে এটি পরিচালনা করতে হবে তা সনাক্ত করতে পারে। আপনাকে application/jsonশিরোনামটি দেখতে হবে এবং যদি এটি হয় তবে এটি JSON হিসাবে পার্স করুন।

এটি আসলে কীভাবে jQuery কাজ করে। আপনি যদি ফলাফলটি দিয়ে কী করতে চান তা না বললে এটি এর সাথে কী করবে তা সনাক্ত করতে এটি ব্যবহার করে Content-Type


12
এটি সম্পূর্ণ সত্য নয়। আপনি যদি header('Content-Type: application/json');এরপরেও ডাউনলোডটি ব্যবহার এবং জোর করে ব্যবহার না করেন Content-Disposition: attachment; filename=myfile.jsonতবে আপনি একটি দিয়ে শেষ করবেন myfile.json.html। এই জসন শিরোলেখ ব্যবহার করে, আপনি পাবেন myfile.json
রেমি গ্রুমিউ

4
@RemiGrumeau 'সম্পূর্ণ সত্য নয়' কী? ব্রাউজারের সাথে ফাইলগুলি ডাউনলোড করা সম্পূর্ণ আলাদা is ব্রাউজারটি সম্ভবত এইচটিএমএল প্রত্যাশার জন্য ডিফল্ট হবে, সুতরাং এটি অন্যথায় সুনির্দিষ্টভাবে উল্লেখ না করা হিসাবে এটি প্রাপ্ত কোনও কিছু ধরে নেয় HTML। ডাউনলোড .htmlকরার সময় এটি ফাইলে সংযোজন হয়, কারণ এটি এটি ডিফল্ট হয়।
বজায়মান

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

7

Content-Type: application/jsonশুধু কন্টেন্ট শিরোনাম। বিষয়বস্তু শিরোনামটি কেবল ফেরত দেওয়া তথ্যগুলির প্রকারের তথ্য, যেমন: জেএসএন, চিত্র (পিএনজি, জেপিজি, ইত্যাদি ..), এইচটিএমএল।

মনে রাখবেন, জাভাস্ক্রিপ্টে JSON একটি অ্যারে বা অবজেক্ট। আপনি যদি সমস্ত ডেটা দেখতে চান তবে সতর্কতার পরিবর্তে কনসোল.লগ ব্যবহার করুন:

alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects

আপনি যদি আসল JSON সামগ্রীটি স্ট্রিং হিসাবে সতর্ক করতে চান তবে একক উদ্ধৃতি চিহ্ন যুক্ত করুন ('):

echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}

ডাবল উদ্ধৃতি ব্যবহার করবেন না। এটি জাভাস্ক্রিপ্টকে বিভ্রান্ত করবে, কারণ জেএসএন প্রতিটি মান এবং কীতে ডাবল উদ্ধৃতি ব্যবহার করে:

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

// It will return the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>

এই কাজ কখনই, এটা একক উদ্ধৃতি ব্যবহার করে যে কোনও স্ট্রিং উপর ভঙ্গ করবে (এবং বিভিন্ন ভাষায় ঘন এর): echo "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; এই ভাঙ্গা আউটপুট উত্পাদন করা হবে: '{"text":"it's wrong"}'। পরিবর্তে এই ব্যবহার করুন: json_encode(json_encode(array('text' => 'it\'s good')))। ফলাফল সঠিকভাবে পালানো হবে:"{\"text\":\"it's wrong\"}"
পোফম্যাগিকফিংগার্স

1

নীচের কোডটি সামনের প্রান্তে জাভাস্ক্রিপ্টের জন্য একটি JSON অবজেক্ট ফিরিয়ে দিতে সহায়তা করে

আমার টেম্পলেট কোড

template_file.json

{
    "name": "{{name}}"
}

পাইথন ব্যাকড কোড

def download_json(request):
    print("Downloading JSON")
    # Response render a template as JSON object
    return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")    

ফাইল url.py

url(r'^download_as_json/$', views.download_json, name='download_json-url')

সামনের প্রান্তের জন্য jQuery কোড

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ', data);
        console.log('Name', data.name);
        alert('hello ' + data.name);
    });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.