كيفية إرسال نص منشور في طلب HttpClient في Windows Phone 8؟

سئل على ٦ أغسطس ٢٠١٤  ·  تمت مشاهدة 176.6k مرة  ·  مصدر

Balraj Singh picture
في ٦ أغسطس ٢٠١٤

لقد كتبت الكود أدناه لإرسال الرؤوس ، معلمات النشر. المشكلة هي أنني أستخدم SendAsync حيث يمكن الحصول على طلبي أو POST. كيف يمكنني إضافة نص POST إلى هذه القطعة من الكود بحيث إذا كان هناك أي بيانات نصية تتم إضافتها في الطلب الذي أقوم به ، وإذا كانت عملية GET أو POST بسيطة بدون نص ، فإنها ترسل الطلب بهذه الطريقة. الرجاء تحديث الكود أدناه:

HttpClient client = new HttpClient();

// Add a new Request Message
HttpRequestMessage requestMessage = new HttpRequestMessage(RequestHTTPMethod, ToString());

// Add our custom headers
if (RequestHeader != null)
{
    foreach (var item in RequestHeader)
    {

        requestMessage.Headers.Add(item.Key, item.Value);

    }
}

// Add request body


// Send the request to the server
HttpResponseMessage response = await client.SendAsync(requestMessage);

// Get the response
responseString = await response.Content.ReadAsStringAsync();

الإجابات

Ilya Luzyanin picture
في ٦ أغسطس ٢٠١٤
130

هذا يعتمد على المحتوى الذي لديك. تحتاج إلى تهيئة موقعك requestMessage.Content باستخدام HttpContent جديد. فمثلا:

...
// Add request body
if (isPostRequest)
{
    requestMessage.Content = new ByteArrayContent(content);
}
...

حيث content هو المحتوى المشفر الخاص بك. يجب عليك أيضًا تضمين رأس نوع المحتوى الصحيح.

تحديث:

أوه ، يمكن أن يكون أجمل (من هذه الإجابة ):

requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
Adam Hey picture
في ١٣ يونيو ٢٠١٨
8

لقد نفذته بالطريقة التالية. أردت طريقة MakeRequest يمكنها استدعاء واجهة برمجة التطبيقات (API) الخاصة بي وتلقي محتوى لمحتوى نص الطلب - وكذلك إلغاء تسلسل الاستجابة إلى النوع المطلوب. قمت بإنشاء كائن Dictionary<string, string> لإيواء المحتوى الذي سيتم إرساله ، ثم قمت بتعيين الخاصية HttpRequestMessage Content معه:

طريقة عامة لاستدعاء API:

    private static T MakeRequest<T>(string httpMethod, string route, Dictionary<string, string> postParams = null)
    {
        using (var client = new HttpClient())
        {
            HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod(httpMethod), $"{_apiBaseUri}/{route}");

            if (postParams != null)
                requestMessage.Content = new FormUrlEncodedContent(postParams);   // This is where your content gets added to the request body


            HttpResponseMessage response = client.SendAsync(requestMessage).Result;

            string apiResponse = response.Content.ReadAsStringAsync().Result;
            try
            {
                // Attempt to deserialise the reponse to the desired type, otherwise throw an expetion with the response from the api.
                if (apiResponse != "")
                    return JsonConvert.DeserializeObject<T>(apiResponse);
                else
                    throw new Exception();
            }
            catch (Exception ex)
            {
                throw new Exception($"An error ocurred while calling the API. It responded with the following message: {response.StatusCode} {response.ReasonPhrase}");
            }
        }
    }

استدعاء الطريقة:

    public static CardInformation ValidateCard(string cardNumber, string country = "CAN")
    { 
        // Here you create your parameters to be added to the request content
        var postParams = new Dictionary<string, string> { { "cardNumber", cardNumber }, { "country", country } };
        // make a POST request to the "cards" endpoint and pass in the parameters
        return MakeRequest<CardInformation>("POST", "cards", postParams);
    }