it-swarm.asia

كيفية الحصول على POST البيانات في Web API؟

أرسل طلبًا إلى الخادم بالشكل التالي:

http://localhost:12345/api/controller/par1/par2

تم حل الطلب بطريقة صحيحة مثل:

[HttpPost]
public void object Post(string par1, string par2)

ومع ذلك ، أقوم بتمرير بيانات إضافية من خلال محتوى الطلب. كيف يمكنني استرجاع هذه البيانات؟

من أجل المثال ، دعنا نقول ، أن الطلب يتم إرساله من النموذج:

<form action="http://localhost:12345/api/controller/par1/par2" method="post">
    <input type="hidden" name="data" value="value" />
    <input type="submit" name="submit" value="Submit" />
</form>
47
Spook

من الإجابة في هذا السؤال: كيفية الحصول على قيم Json Post Values ​​مع asp.net webapi

  1. Autoparse باستخدام المعلمة ملزمة. لاحظ أن dynamic تتكون من JToken ، ومن هنا تأتي أداة الوصول .Value.

    public void Post([FromBody]dynamic value) {
        var x = value.var1.Value; // JToken
    }
    
  2. اقرأ تمامًا مثل Request.RequestUri.ParseQueryString()[key]

    public async Task Post() {        
       dynamic obj = await Request.Content.ReadAsAsync<JObject>();
       var y = obj.var1;
    }
    
  3. مثل رقم 2 ، ليس فقط بشكل غير متزامن (؟) حتى تتمكن من استخدامه بطريقة مساعدة

    private T GetPostParam<T>(string key) {
        var p = Request.Content.ReadAsAsync<JObject>();
        return (T)Convert.ChangeType(p.Result[key], typeof(T)); // example conversion, could be null...
    }
    

تحذير - يتوقع نوع الوسائط application/json من أجل تشغيل JsonMediaTypeFormatter معالجة.

66
drzaus

بعد أن قضيت وقتًا طويلاً في محاولة لفّ عقلي حول تحول النموذج (الهام ولكن القوي) بين الطرق القديمة لمعالجة بيانات نماذج الويب وكيف يتم ذلك مع WebAPI ، اعتقدت أنني سأضيف سنتي إلى هذه المناقشة .

ما أردت القيام به (وهو أمر شائع جدًا في معالجة نماذج الويب لـ POST) هو التمكن من الحصول على أي من قيم النماذج التي أريدها ، بأي ترتيب. قل أنك تستطيع القيام به إذا كانت لديك بياناتك في System.Collections.Specialized.NameValueCollection. لكن ، فيما يتعلق بـ WebAPI ، البيانات من POST تعيد إليك كدفق ، لذلك لا يمكنك القيام بذلك مباشرة.

ولكن هناك فئة صغيرة رائعة تسمى FormDataCollection (في System.Net.Http.Formatting) وما ستتيح لك القيام به هو التكرار من خلال مجموعتك مرة واحدة.

لذلك كتبت طريقة فائدة بسيطة ستعمل من خلال FormDataCollection مرة واحدة وألصق جميع القيم في NameValueCollection. بمجرد القيام بذلك ، يمكنك القفز في جميع أنحاء البيانات إلى محتوى قلوبكم.

لذلك في صفتي المشتقة من ApiController ، لدي طريقة نشر مثل هذا:

    public void Post(FormDataCollection formData)
    {
        NameValueCollection valueMap = WebAPIUtils.Convert(formData);

        ... my code that uses the data in the NameValueCollection
    }

تبدو طريقة التحويل في فئة WebAPIUtils الثابتة كما يلي:

    /// <summary>
    /// Copy the values contained in the given FormDataCollection into 
    /// a NameValueCollection instance.
    /// </summary>
    /// <param name="formDataCollection">The FormDataCollection instance. (required, but can be empty)</param>
    /// <returns>The NameValueCollection. Never returned null, but may be empty.</returns>
    public static NameValueCollection Convert(FormDataCollection formDataCollection)
    {
        Validate.IsNotNull("formDataCollection", formDataCollection);

        IEnumerator<KeyValuePair<string, string>> pairs = formDataCollection.GetEnumerator();

        NameValueCollection collection = new NameValueCollection();

        while (pairs.MoveNext())
        {
            KeyValuePair<string, string> pair = pairs.Current;

            collection.Add(pair.Key, pair.Value);
        }

        return collection;
     }

أتمنى أن يساعدك هذا!

20
Brad

واجهت مشكلة في إرسال طلب بمعلمات متعددة.

لقد قمت بحلها عن طريق إرسال فئة ، مع المعلمات القديمة كخصائص.

<form action="http://localhost:12345/api/controller/method" method="post">
    <input type="hidden" name="name1" value="value1" />
    <input type="hidden" name="name2" value="value2" />
    <input type="submit" name="submit" value="Submit" />
</form>

فئة النموذج:

public class Model {
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

مراقب:

public void method(Model m) {
    string name = m.Name1;
}
11
Corné Strijkert

من الصعب التعامل مع معلمات متعددة في الإجراء مباشرة. أفضل طريقة للقيام بذلك هي إنشاء فئة نموذج عرض. ثم لديك معلمة واحدة ولكن المعلمة تحتوي على خصائص بيانات متعددة.

public class MyParameters
{
    public string a { get; set; } 
    public string b { get; set; }
}

public MyController : ApiController
{
    public HttpResponseMessage Get([FromUri] MyParameters parameters) { ... }
}

ثم تذهب إلى:

http://localhost:12345/api/MyController?a=par1&b=par2

المرجع: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

إذا كنت تريد استخدام "/ par1/par2" ، يمكنك تسجيل قاعدة توجيه asp. على سبيل المثال routeTemplate: "API/{controller}/{action}/{a}/{b}".

راجع http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

9
Curtis Yallop

لقد وجدت أن حالة الاستخدام الخاصة بي كانت أكثر فائدة ، ونأمل أن تساعد شخصًا آخر قضى وقتًا في هذه الإجابة في تطبيقها

public IDictionary<string, object> GetBodyPropsList()
        {
            var contentType = Request.Content.Headers.ContentType.MediaType;
            var requestParams = Request.Content.ReadAsStringAsync().Result;

            if (contentType == "application/json")
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, object>>(requestParams);
            }
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
3
Maslow

لا شيء من الإجابات هنا عملت بالنسبة لي. يبدو أن استخدام FormDataCollection في طريقة النشر هو الإجابة الصحيحة ، لكن شيئًا ما حول طلب النشر الخاص بي أدى إلى اختناق webapi. في النهاية ، نجحت في العمل من خلال تضمين أي معلمات في استدعاء الأسلوب وفقط تحليل معلمات النموذج يدويًا مثل هذا يدويًا.

public HttpResponseMessage FileUpload() {
    System.Web.HttpRequest httpRequest = System.Web.HttpContext.Current.Request;
    System.Collections.Specialized.NameValueCollection formData = httpRequest.Form;
    int ID = Convert.ToInt32(formData["ID"]);
    etc
2
nuander

هل هناك طريقة للتعامل مع بيانات نشر النموذج في وحدة تحكم Web Api؟

تتمثل الطريقة المعتادة في ASP.NET Web API في تمثيل النموذج كنموذج بحيث يقوم منسق نوع الوسائط بإلغاء التسلسل. البديل هو تعريف معلمة الإجراءات كـ NameValueCollection:

public void Post(NameValueCollection formData)
{
  var value = formData["key"];
}
2
GreyCloud

جرب هذا.

public string Post(FormDataCollection form) {
    string par1 = form.Get("par1");

    // ...
}

كان يعمل بالنسبة لي مع الويب api 2

1
Antonio Santise