webentwicklung-frage-antwort-db.com.de

Wie sende ich einen Post-Body in der HttpClient-Anforderung in Windows Phone 8?

Ich habe den folgenden Code geschrieben, um Header zu senden und Parameter zu posten. Das Problem ist, dass ich SendAsync verwende, da meine Anfrage GET oder POST sein kann. Wie kann ich diesem Stück Code POST Body hinzufügen, so dass, wenn es irgendwelche Post-Body-Daten gibt, diese in der von mir gestellten Anfrage hinzugefügt werden und wenn es einfach GET oder POST ohne body sendet es die Anfrage auf diese Weise. Bitte aktualisiere den folgenden Code:

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();
41
Balraj Singh

Dies hängt davon ab, welchen Inhalt Sie haben. Sie müssen Ihre Eigenschaft requestMessage.Content Mit new HttpContent initialisieren. Beispielsweise:

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

dabei ist content Ihr codierter Inhalt. Sie sollten auch den richtigen Content-Type-Header einschließen.

AKTUALISIEREN:

Oh, es kann noch schöner sein (von diesem Antwort ):

requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
89
Ilya Luzyanin

Ich habe es folgendermaßen implementiert. Ich wollte eine generische MakeRequest -Methode, mit der ich meine API aufrufen und Inhalte für den Hauptteil der Anforderung empfangen und die Antwort in den gewünschten Typ deserialisieren kann. Ich erstelle ein Dictionary<string, string> Objekt, um den zu sendenden Inhalt unterzubringen, und setzen Sie die Eigenschaft HttpRequestMessageContent damit:

Generische Methode zum Aufrufen der 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}");
            }
        }
    }

Rufe die Methode auf:

    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);
    }
5
Adam Hey