【问题标题】:How to issue PUT HttpWebRequest如何发出 PUT HttpWebRequest
【发布时间】:2012-01-29 15:38:46
【问题描述】:

我正在尝试与需要 PUT 来更新数据的 API 集成:

这是他们使用 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

但是,我需要使用 .NET MVC 3 来使用 JSON(他们也支持)。知道如何做到这一点吗?

我使用下面的代码成功获取:

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");

如果是这样,我应该将“data-binary”中所需的数据放在哪里?

【问题讨论】:

    标签: asp.net-mvc-3 httpwebrequest


    【解决方案1】:

    嗯,这是一个可能的起源点 - 未经测试;直接写入浏览器;不是生产代码;假设 PUT 调用发送和接收相同的对象类型(可能不是这种情况)...

    主要的补充是您需要提供请求的 ContentLength,并且您需要将序列化的 JSON 对象写入请求流,您将通过调用 HttpWebRequest::GetRequestStream() 获得。这与 POST 时的方法相同。

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      相关资源
      最近更新 更多