【问题标题】:ASP.NET MVC Web API 4 REST Webservice: PUT/POST - ing a List of objectsASP.NET MVC Web API 4 REST Web 服务:PUT/POST - 在对象列表中
【发布时间】:2013-02-23 06:06:54
【问题描述】:

想知道是否可以和/或支持将整个对象放入/发布到 REST Web 服务,而不仅仅是一些名称/值对?

如果可以,是否也可以放置/发布对象列表?

我认为这是可能的,因为 GET 请求能够返回对象列表,我想对更新的对象进行“反向”操作(而不是一次发送一个,或者更糟,通过名称/值对在单个部分中)?

我知道这是一个非常基本的问题,但到目前为止我采取的方法是尝试对 PUT 进行编码并使其工作(如果 PUT 函数没有参数,则该工作有效,例如:

public class AObjectController : ApiController
{
    public List<int[]> Put()
    {
        List<int[]> ret = new List<int[]>();

        ret.Add(new int[] {-1, 1111});
        ret.Add(new int[] {-2, 2222});

        return ret;
    }

如果我指定单个对象或对象列表,则会出现异常:

    public List<int[]> Put(AObject object)         **CASE 1**
    public List<int[]> Put(List<AObject> objects)  **CASE 2**
    {
        List<int[]> ret = new List<int[]>();

        ret.Add(new int[] { -1, 1111 });
        ret.Add(new int[] { -2, 2222 });

        return ret;
    }

案例 1: public List(int[]) Put(AObject object)



案例 2: public List(int[]) Put(List(AObject) objects)



下面是正在调用的客户端的代码:

    public int writeAll(List<T> data)
    {
        _sendBuffer = 
            JsonConvert.SerializeObject(
                tabletData,
                new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
            );

        byte[] b = StringHelper.GetBytes(_sendBuffer);

        string url = ContructUrlRequest(null, null);

        WebRequest request = WebRequest.Create(url);

        request.Method = "PUT";
        request.ContentType = "application/json";
        request.ContentLength = b.Length;
        request.Credentials = CredentialCache.DefaultCredentials;
        ((HttpWebRequest)request).UserAgent = "...";
        //((HttpWebRequest)request).AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(b, 0, b.Length);
            requestStream.Flush();
            requestStream.Close();
        }

        WebResponse response = request.GetResponse();

        if (response == null)
        {

            return -1;
        }

        StreamReader sr = new StreamReader(response.GetResponseStream()); ;

        _recieveBuffer = sr.ReadToEnd();

        List<int[]> _resultData = JsonConvert.DeserializeObject<List<int[]>>(
            _recieveBuffer,
            new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
        );

        return data.Count;
    }

谢谢。

【问题讨论】:

  • 你能告诉我们你得到了什么例外吗?
  • 是的,现在抓取,并发布客户端代码(正在进行中)。
  • 你应该使用HttpClient,它是官方的Web Api客户端,它支持Json.Net,msdn.microsoft.com/en-us/library/…
  • @Cuong Le 我会给 HttpClient 一个机会,但我记得使用 HttpWebRequest 失败(当我在项目开始时从 web 服务读取/获取时),并且事情“刚刚工作”时我使用了普通的旧 WebRequest。我需要研究一下这是否相关,谢谢。
  • 可能只是需要指定UTF-8的字符集...

标签: rest asp.net-web-api


【解决方案1】:

在我的客户端使用了来自服务器的序列化编写代码,它工作了

    public int writeAll(List<AObject> aObjects)
    {
        string url = ContructUrlRequest(null, null);

        WebRequest request = WebRequest.Create(url);
        request.Method = WebRequestMethods.Http.Put;
        request.ContentType = "application/json; charset=utf-8";            
        request.Credentials = CredentialCache.DefaultCredentials;
        ((HttpWebRequest)request).UserAgent = "going insane";

        JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
        serializerSettings.TypeNameHandling = TypeNameHandling.Objects | TypeNameHandling.Arrays;
        serializerSettings.Converters.Add(new IsoDateTimeConverter());

        JsonSerializer serializer = JsonSerializer.Create(serializerSettings);

        using (Stream requestStream = request.GetRequestStream())
        {
            using (StreamWriter streamWriter = new StreamWriter(requestStream, new UTF8Encoding(false, true)))
            {
                using (JsonTextWriter jsonTextWriter = new JsonTextWriter(streamWriter))
                {
                    serializer.Serialize(jsonTextWriter, aObjects);
                }
            }
        }

        WebResponse response = request.GetResponse();

        if (response == null)
        {
            Log.Info(FIDB.TAG_WSBUFFER, "WSBuffer.writeAll: response = NULL");

            return -1;
        }

        StreamReader sr = new StreamReader(response.GetResponseStream());

        _recieveBuffer = sr.ReadToEnd();

        _resultData = JsonConvert.DeserializeObject<List<int[]>>(
            _recieveBuffer,
            new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
        );

        return tabletData.Count;
    }

【讨论】:

  • 我认为真正的问题是我设置了错误的内容长度(request.ContentLength = StringHelper.GetBytes(_sendBuffer).Length),使用此处的方法后的 b/c,以及没有指定 ContentLength,我注意到在服务器端(在单步调试时)内容长度是同一对象的一半。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2014-10-17
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多