Подтвердить что ты не робот

Передача значений в запрос PUT JSON в С#

Я работаю с API и пытаюсь выполнить запрос JSON PUT в С#. Это код, который я использую:

    public static bool SendAnSMSMessage()
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://apiURL");
        httpWebRequest.ContentType = "text/json";
        httpWebRequest.Method = "PUT";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = **// Need to put data here to pass to the API.**

            streamWriter.Write(json);
        }
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            //Now you have your response.
            //or false depending on information in the response
            return true;
        }
    }

Проблема заключается в том, что я не могу понять, как передать данные API. Поэтому, как и в JavaScript, я бы сделал что-то подобное, чтобы передать данные:

        type: 'PUT',
        data: { 'reg_FirstName': 'Bob',
                'reg_LastName': 'The Guy',
                'reg_Phone': '123-342-1211',
                'reg_Email': '[email protected]',
                'reg_Company': 'None',
                'reg_Address1': 'Some place Dr',
                'reg_Address2': '',
                'reg_City': 'Mars',
                'reg_State': 'GA',
                'reg_Zip': '12121',
                'reg_Country': 'United States'

Как мне сделать то же самое в С#? Спасибо!

4b9b3361

Ответ 1

httpWebRequest.ContentType = "text/json";

обязательно должно быть:

httpWebRequest.ContentType = "application/json";

Кроме этого, я не вижу ничего плохого в вашем текущем коде.

Что касается части поколения JSON, вы можете использовать JSON serializer:

var serializer = new JavaScriptSerializer();

string json = serializer.Serialize(new 
{
    reg_FirstName = "Bob",
    reg_LastName = "The Guy",
    ... and so on of course
});

В этом примере я, очевидно, использовал анонимный объект, но вы могли бы прекрасно определить модель, свойства которой совпадают, а затем передать экземпляр этой модели методу Serialize. Вы также можете проверить библиотеку Json.NET, которая является сторонним JSON-сериализатором, который легче и быстрее, чем встроенный .NET.


Но, как говорится, вы могли бы также услышать о ASP.NET Web API, а также о предстоящем .NET 4.5. Если вы это сделали, вы должны знать, что будет веб-клиент API HTTP (HttpClient), который специально предназначен для этих нужд. Использование WebRequest для использования API с поддержкой JSON будет считаться устаревшим кодом через пару месяцев. Я упоминаю об этом, потому что вы можете использовать NuGet для использования этого нового клиента прямо сейчас и упростить жизнь бедной души (задача миграции вашего кода на .NET XX), которая через пару лет будет смотреть на ваш код и, возможно, даже не знал бы, что такое WebRequest: -)

Ответ 2

Если вы хотите имитировать поведение JavaScript с .NET С# Client, вы также должны установить несколько дополнительных конфигураций объекта Request, помимо ContentType, вот рабочий пример:

string serializedObject = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
HttpWebRequest request = WebRequest.CreateHttp(storeUrl);
request.Method = "PUT";
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/json";
request.Accept = "Accept=application/json";
request.SendChunked = false;
request.ContentLength = serializedObject.Length;
using (var writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(serializedObject);
}
var response = request.GetResponse() as HttpWebResponse;

Таким образом, полный контент будет отправлен вместе с запросом, поэтому привязки данных ASP.NET MVC WebAPI могут работать с их магией.

Излишне говорить, что вы должны быть осторожны с размером контента, поскольку он будет отправлен сразу, а не потоковым/фрагментированным.