Как оформить PUT HttpWebRequest - PullRequest
       3

Как оформить PUT HttpWebRequest

1 голос
/ 29 января 2012

Я пытаюсь интегрировать с API, который требует PUT для обновления данных:

Вот пример из них, использующий curl:

curl --request PUT \
     --user-agent "Your Client Name/1.0" \
     --header "Content-Type: application/xml" \
     --data-binary '<order><status_id>10</status_id></order>' \
     https://www.example.com/api/v2/orders/101

Однако мне нужно было бы использовать JSON (они тоже это поддерживают) с использованием .NET MVC 3. Есть идеи, как мне это сделать?

Я успешно использую приведенный ниже код для GET:

Order obj = Call<Order>(url, "GET");

    private T Call<T>(string url, string methodType) where T : class {
        T result;
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = methodType;
        request.Accept = "application/json";
        request.ContentType = "application/json";

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string jsonData = reader.ReadToEnd();
            result = (T)jsSerializer.Deserialize<T>(jsonData);
        }

        return result;
    }

Однако можно ли выдать PUT аналогичным способом?

Order obj = Call<Order>(url, "PUT");

Если это так, куда я помещаю данные, которые требуются, в «двоичные данные»?

1 Ответ

0 голосов
/ 29 января 2012

Ну, вот возможная точка происхождения - непроверенная; написано прямо в браузере; не производственный код; предполагает, что вызов PUT отправляет и получает один и тот же тип объекта (что, вероятно, не так) ...

Основным дополнением является то, что вам нужно предоставить ContentLength запроса, и вам нужно записать сериализованный объект JSON в поток запросов, который вы получите, вызвав HttpWebRequest :: GetRequestStream (). Это тот же подход, что и при размещении почты.

private T Call<T>(string url, string methodType, T data) where T: class
{
    T result;

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = methodType;
    request.ContentType = "application/json";
    request.Accept = "application/json";

    if (methodType == "PUT" || methodType == "POST")
    {
       JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
       string jsonData = jsSerializer.Serialize(data);

       byte[] arrData = Encoding.UTF8.GetBytes(jsonData);
       request.ContentLength = arrData.Length;

       using (Stream dataStream = request.GetRequestStream())
       {
          dataStream.Write(arrData, 0, arrData.Length);
       }
    }

    // Note: You may not need to parse any response content,
    // or it may be a different class
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader 
                          = new StreamReader(response.GetResponseStream()))
        {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string jsonData = reader.ReadToEnd();
            result = (T)jsSerializer.Deserialize<T>(jsonData);
        }
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...