هل يقوم RestSharp بالكتابة فوق تعيين نوع المحتوى يدويًا؟

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

  •  12-11-2019
  •  | 
  •  

سؤال

أقوم بإنشاء RestSharp.RestRequest عبر:

RestRequest request = new RestRequest();
request.Method = Method.POST;
request.Resource = "/rest-uri";

request.AddHeader("Content-Type", "application/someContentType");

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine +
             "<register-request">" + Environment.NewLine +
             "    <name=\"someName\"/>" + Environment.NewLine +
             "</register-request>");

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody);

(يتم ضبط نوع المحتوى يدويًا على application/someContentType)

في وضع التصحيح يظهر أيضًا Content-Type=application/someContentType

لكن تنفيذ RestRequest يُرجع ملفًا 415 Media Not Supported-يظهر الخطأ وWireShark أنه تم ضبط نوع الوسائط على text/xml (مثل ما تم تعيينه في طريقة AddParameter).

لماذا يعرض RestSharp نوع محتوى مختلفًا عن WireShark؟وكيف يمكنني منع تغيير نوع المحتوى (إذا كان كذلك)؟

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

المحلول

تعليق svick هو الصحيح.قم بتعيين نوع المحتوى في المعلمة الأولى لـ AddParameter() ويمكنك ترك AddHeader() يتصل.

على الرغم من أن هذه هي الإجابة "الصحيحة"، إلا أنني سأشرح سبب وجود طريقة مربكة للقيام بذلك وهي ليست واضحة تمامًا.

الطريقة المقصودة لتحقيق ذلك هي الاستخدام AddBody() جنبا إلى جنب مع RestRequest.RequestFormat.مثال:

var client = new RestClient();
// client.XmlSerializer = new XmlSerializer(); // default
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer

var request = new RestRequest();
request.RequestFormat = DataFormat.Xml;
request.AddBody(objectToSerialize);

التسلسل ل objectToSerialize يعتمد على المسجل XmlSerializer.إذا كنت تستخدم RequestFormat = DataFormat.Json, ، ثم RestClient.JsonSerializer يستخدم.تنفيذات ISerializer (والتي يمكنك استخدامها لتجاوز التسلسل الافتراضي) أعلن عن أنواع المحتوى الخاصة بهم وهو ما يتم تمريره عبر janky AddParameter() الزائد الذي تستخدمه.

AddParameter(contentType, content, ParameterType.RequestBody) لم يكن من المفترض أن يتم الاتصال بك مباشرة.تمت إضافته كحل بديل لتمرير البيانات من AddBody() ولكن بعد ذلك أصبحت أشياء أخرى تعتمد عليه، لذا ظل عالقًا.لقد كان قرارًا فظيعًا بعد فوات الأوان ولكن فات الأوان لتغييره في سطر إصدار 1xx.إذا قمت ببناء نسخة أخرى سأجعل هذا الأمر أكثر وضوحًا.

نصائح أخرى

من الممكن تغيير نوع المحتوى عند ضبط محتوى النص.تقوم معلمة NAME الخاصة بالجسم بتعيين نوع المحتوى.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top