jQuery $ .post - JSON - طريقة مناسبة لإرسال/استلام بيانات الإدخال (على جانب العميل فقط) - سؤالين

StackOverflow https://stackoverflow.com/questions/3546661

  •  30-09-2019
  •  | 
  •  

سؤال

دعونا نتخيل أن لدينا شيء مثل:

$.post('somescript.php', 'WHAT CAN WE PUT HERE?',
        function(replyData) {

1) بشكل افتراضي ، الحجة الثالثة من طريقة .post $ ، هل ستقرأ استجابة XMLResponse الصحيحة؟ فلماذا نحتاج إلى هذه الحجة "ReplyData"؟ ما هي الأسباب التي قد تكون لدينا على هذه الحجة؟

2) الحجة الثانية يقبل البيانات التي سيتم إرسالها. موافق. أرغب في استخدام JSON ، ومع ذلك ، لست متأكدًا مما إذا كان ينبغي علي استخدام تنسيق JSON في تلك الوسيطة الثانية أو استهدف حقل نموذج الإدخال الذي سيحتوي على هذه البيانات؟

ملاحظات إضافية: ستأتي البيانات من حقل إدخال ، وأحتاج إلى إرساله عبر طلب Ajax $ .post إلى الخادم. أنوي استخدام وظائف JSON Encode و JSON Decode PHP.

شكرا مقدما ، ميم

هل كانت مفيدة؟

المحلول

ال replyData تحتوي الوسيطة على جسم الاستجابة التي يتم إرجاعها بواسطة الخادم ، والتي يمكنك معالجتها بعد ذلك لعرضها على صفحتك ، والتحقق من أن جانب الخادم قد تمت معالجته بنجاح ، وما إلى ذلك. لا يتعين عليك استخدامها (على سبيل المثال ، إذا كنت لا تُرجع أي بيانات).

البيانات التي تزودها (بتنسيق JSON) ، ستظل بحاجة إلى أن تكون في شكل سلسلة استعلام ، على سبيل المثال param=value. ستحتاج القيمة أيضًا إلى الترميز بشكل صحيح ، باستخدام EncodeUricOpment ():

$.post('somescript.php', 'data='+encodeURIComponent(myJSON),
    function(replyData) {

ثم ، يمكنك الوصول إلى JSON في البرنامج النصي PHP من خلال $ _post superglobal:

$data = json_decode($_POST['data']);

ومع ذلك ، سيكون JSON مبالغة قليلاً لحقل إدخال بسيط. من غير المألوف استخدام JSON بدلاً من أزواج الاسم/القيمة لحقول النموذج.

نصائح أخرى

1) الوسيطة الثالثة هي وظيفة رد الاتصال. إذا قمت بتزويد وظيفة مجهولة ، كما هو الحال في نموذجك ، فأنت بحاجة إلى تسمية الوسيطة للوصول إليها. إذا قمت بإرجاع بنية JSON ، فيمكنك الوصول إلى ReplyData.foo إلخ.

2) يمكنك سحب القيم من النموذج الخاص بك وبناء بنية JSON.

var data = {};
data.threadid = $(form).find('input[name=threadid]').val();
data.commentid = $(form).find('input[name=commentid]').val();

$.post('somescript.php', data, function(replyData) { alert(replyData.foo); } );

لقد سرقت هذه الوظيفة من Drupal وأصلح الفاصلة الفاصلة على المصفوفات والأشياء التي تسببت في Zend_JSON_Server لرمي الاستثناءات.

    var toJson = function(v) {
  // typeof null == object so we check beforehand;
  if ( v == null ){
    return null;  
  }

  switch (typeof v) {
    case 'boolean':
      return v == true ? 'TRUE' : 'FALSE';
    case 'number':
      return v;
    case 'string':
      return '"'+ v +'"';
    case 'object':
      if ( !(v instanceof Array) ){
          var output = "{";
          for(i in v) {
            output = output + '"'+i+'"' + ":" + toJson(v[i]) + ",";
          }
          output = output.substr(0,output.length-1) + "}"; // Fix the trailing comma error wich isn't officialy allowed.
      }else{
          var output = "[";
          for(i in v) {
            output = output + toJson(v[i]) + ",";
          }
          output = output.substr(0,output.length-1) + "]"; // Fix the trailing comma error wich isn't officialy allowed.
      }
      return output;
    default:
      return null;
  }
}

الآن فقط أطعمها بياناتك مثل هذا:

var myJsonString = toJson($('myform').serialize());

سوف يعيد Wich سلسلة JSON التي تم إنشاؤها بشكل متكرر من متغيرك. يعمل لمعظم تطبيقاتي.

بشكل عام أتفق مع آندي ه أنه إذا نظرت إلى سلسلة من البيانات التي سيتم نشرها يجب أن تبدو

'data='+encodeURIComponent(myJSON)

أريد فقط أن أوضح ، أنه في الممارسة ، استخدم المعلمة الثانية من $ .post ليس كسلسلة:

$.post('somescript.php', 'data='+encodeURIComponent(myJSON), ... );

ولكن ككائن:

$.post('somescript.php', {data: myJSON}, ...);

ثم مكالمة jQuery encodeURIComponent الوظيفة وبناء السلسلة 'data='+encodeURIComponent(myJSON) مع الاحترام لل jquery.param () داخليا. الأهم من ذلك بكثير لفهم ذلك myJSON يجب عليك إنتاج سلسلة JSON هذه فيما يتعلق ببعض وظائف ترميز JSON من كائن يحتوي على البيانات التي تريد نشرها. لذلك سوف يبحث الرمز في الممارسة مثل المتابعة

$.post('somescript.php', { data: JSON.stringify(myObject) }, ...);

أين JSON.stringify هي وظيفة JavaScript من JSON2.JS والتي يمكنك تنزيلها مجانًا من http://www.json.org/js.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top