سؤال

أقوم بإعادة هيكلة نظام C++ القديم إلى SOA باستخدام gSoap.لدينا بعض مشكلات الأداء (ملفات XML الكبيرة جدًا) لذا طلب مني العميل المحتمل إلقاء نظرة على المخازن المؤقتة للبروتوكول.لقد فعلت ذلك، ويبدو رائعًا جدًا (نحتاج إلى دعم C++ وJava).ومع ذلك، تعد المخازن المؤقتة للبروتوكول حلاً للتسلسل فقط وأحتاج الآن إلى إرسالها إلى واجهة Java الأمامية.ما الذي يجب أن أستخدمه من منظور C++ وJava لإرسال تلك العناصر المتسلسلة عبر HTTP (الشبكة الداخلية فقط)؟

ملاحظة.يحاول شخص آخر تسريع حل gSoap الخاص بنا، وأنا مهتم بالمخازن المؤقتة للبروتوكول فقط.

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

المحلول

ويمكنك إرسال بالتأكيد حتى حمولة الثنائية مع طلب HTTP، أو في استجابة HTTP. مجرد كتابة بايت من المخزن المؤقت بروتوكول مباشرة في الطلب / ردا على ذلك، وتأكد من تعيين نوع المحتوى إلى "التطبيق / الثماني تيار". العميل والخادم، وينبغي أن تكون قادرة على رعاية بقية بسهولة. أنا لا أعتقد أنك بحاجة إلى أي شيء خاص أكثر من ذلك على حد سواء.

نصائح أخرى

وProtoBuf هو بروتوكول ثنائي. فإنه لا تخلط جيدا مع SOAP. أقترح عليك إما العصا مع gSOAP أو اعتناق ProtoBuf تماما.

ومع protoBuf، عليك أن تحدد البروتوكول الخاص بك في شكل خاص من هذا القبيل،

message Product {
  required string id = 1;
  required string description = 2;
  required int32 quantity = 3;
  optional bool discontinued = 4;
}

وأداة protoc يمكن أن تولد التعليمات البرمجية في C ++ / جافا / بيثون حتى تتمكن من تسلسل على نهاية واحدة وإلغاء تسلسل على آخر.

وكما ترون، تم تصميم ProtoBuf إجراء تسلسل كائن الفردية. فإنه لا يوفر جميع التسهيلات التي تقدمها SOAP، مثل رؤوس. للحصول تغلب على هذه المشكلة، ونحن نستخدم ProtoBuf داخل ProtoBuf. نحدد مغلف مثل هذا،

message Envelope {
  enum Type { 
    SEARCH = 1;
    SEARCH_RESPONSE = 2;
    RETRIEVE = 3;
    RETRIEVE_RESPONSE = 4; 
  }
  required Type type = 1;

  required bytes encodedMessage = 2;

  message Header {
    required string key = 1;
    required bytes value = 2;
  }    
  repeated Header headers = 3;
}

ووencodedMessage هو رسالة ProtoBuf المتسلسلة آخر. كل الاشياء في رأس SOAP يذهب الآن إلى headers.

واجهات أمامية جوجل تفضل application/protobuf.

ProtocolBufferModel من يستخدم العميل API جوجل application/x-protobuf.

ويمكنك إجراء تسلسل البيانات المشفرة / دي تسلسل protobuf إلى / من السلاسل. إرسال سلسلة متسلسلة كهيئة وظيفة HTTP إلى جاوة ودي تسلسل ذلك. وهذا هو نهج واحد. وهناك طريقة أخرى للاستفادة من واجهة خدمة protobuf. Protobuf يسمح لك لتحديد واجهة خدمة في ملف .proto وبروتوكول عازلة مترجم سيولد خدمة رمز واجهة وبذرة في اللغة التي اخترتها. تحتاج فقط إلى تنفيذ protobuf :: RpcChannel وprotobuf :: RpcController الطبقات للحصول على إطار RPC كاملة. ربما يمكنك كتابة المجمع HTTP لهذه الفئات. الاطلاع على الروابط التالية لمزيد من المعلومات:

http://code.google.com/apis/protocolbuffers/ مستندات / proto.html # خدمات http://code.google.com/apis/protocolbuffers /docs/reference/cpp-generated.html#service http://code.google.com/apis /protocolbuffers/docs/reference/cpp/google.protobuf.service.html

وفقًا لمعلوماتي، يتوفر دعم المخازن المؤقتة للبروتوكول في كل من C++ وJava، ويجب أن تكون قادرًا على تبادل البيانات التسلسلية للمخزن المؤقت للبروتوكول بين كلا النظامين.

ومع ذلك، يبدو أن سؤالك الحقيقي هو "كيف يمكنني إرسال أشياء عبر HTTP بين الواجهة الخلفية لـ C++ وعميل Java"

يبدو أنك بحاجة إلى تعلم كيفية استخدام gSOAP، اقرأ مستندات.

وبدلاً من ذلك، يمكنك استضافة خادم ويب RESTful من تطبيق C++ الخاص بك:أنظر إلى هذا: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

بعد ذلك، ستحتاج إلى الوصول إلى البيانات المستضافة على خادم C++ RESTful الجديد:أنظر إلى هذا: بقية العملاء لجافا؟

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