GVKun编程网logo

asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?

8

此处将为大家介绍关于asp.net-mvc–在使用WEBAPI时,如何从POST中提取HttpResponseMessage中的内容?的详细内容,此外,我们还将为您介绍关于.NETCore中间件中的反

此处将为大家介绍关于asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?的详细内容,此外,我们还将为您介绍关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?的有用信息。

本文目录一览:

asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?

asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?

一个非常典型的CRUD操作将导致一个对象的Id设置一旦持久化。

所以,如果我在接受一个对象的控制器上有Post方法(JSON序列化,比方说)并返回一个HttpResponseMessage,其中HttpStatusCode Created和Content设置为同一个对象,Id从null更新为整数,那么我如何使用HttpClient获取在那个Id值?

它可能很简单,但我看到的只是System.Net.Http.StreamContent。从post方法返回Int更好吗?

谢谢。

更新(以下回答):

一个工作的例子……

namespace TryWebAPI.Models {
    public class YouAreJoking {
        public int? Id { get; set; }
        public string ReallyRequiresFourPointFive { get; set; }
    }
}

namespace TryWebAPI.Controllers {
    public class RyeController : ApiController {
        public HttpResponseMessage Post([FromBody] YouAreJoking value) {
            //Patience simulated
            value.Id = 42;

            return new HttpResponseMessage(HttpStatusCode.Created) {
                Content = new ObjectContent<YouAreJoking>(value,new JsonMediaTypeFormatter(),new MediaTypeWithQualityHeaderValue("application/json"))
            };
        }
    }
}

namespace TryWebapiclient {
    internal class Program {
        private static void Main(string[] args) {
            var result = CreateHumour();
            Console.WriteLine(result.Id);
            Console.ReadLine();
        }

        private static YouAreJoking CreateHumour() {
            var client = new HttpClient();
            var pennyDropsFinally = new YouAreJoking { ReallyRequiresFourPointFive = "yes",Id = null };

            YouAreJoking iGetItNow = null;
            var result = client
                .PostAsJsonAsync("http://localhost:1326/api/rye",pennyDropsFinally)
                .ContinueWith(x => {
                                var response = x.Result;
                                var getResponseTask = response
                                    .Content
                                    .ReadAsAsync<YouAreJoking>()
                                    .ContinueWith<YouAreJoking>(t => {
                                        iGetItNow = t.Result;
                                        return iGetItNow;
                                    }
                );

                Task.WaitAll(getResponseTask);
                return x.Result;
            });

            Task.WaitAll(result);
            return iGetItNow;
        }
    }
}

似乎Node.js受到启发。

解决方法

您可以使用ReadAsAsync< T>

.NET 4(你可以在没有延续的情况下做到这一点)

var resultTask = client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject()).ContinueWith<HttpResponseMessage>(t => {
    var response = t.Result;
    var objectTask = response.Content.ReadAsAsync<MyObject>().ContinueWith<Url>(u => {
        var myobject = u.Result;
        //do stuff 
    });
});

.NET 4.5

var response = await client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject());
    var myobject = await response.Content.ReadAsAsync<MyObject>();

.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示

.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示

据我所知,您创建了HttpClientHandler,但没有使用它来构建HttpClient来进行请求。您仍在使用静态_httpClient,它对您创建的cookie容器一无所知。 这应该是您使CookieContainer仍然为空的原因。

看看here,了解如何从HttpResponseMessage获取cookie。

,
               CookieContainer cookies = new CookieContainer();
               HttpClientHandler handler = new HttpClientHandler();
               handler.CookieContainer = cookies;
               _httpClient = new HttpClient(handler);
                var targetRequestMessage = CreateTargetMessage(context,targetUri);

                using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage,HttpCompletionOption.ResponseHeadersRead,context.RequestAborted))
                {
                    //var responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
                    IEnumerable<Cookie> responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
                    foreach (Cookie cookie in responseCookies)
                    {
                        if(cookie.Name=="ASP.NET_SessionId")
                        {
                            Console.WriteLine(cookie.Name + ": " + cookie.Value);
                            context.Response.Headers.Add("Set-Cookie",cookie.Name+"="+cookie.Value);
                        }
                        
                    }

.net Web API 2,return HttpResponseMessage with ObjectContent

.net Web API 2,return HttpResponseMessage with ObjectContent

public async TaskHttpResponseMessage Register(AllenRegistration model) { 1. Will return 400 Error return Request.CreateResponse( HttpStatusCode.BadReques t); 2. Will return Json Type like {return1:A,returnBL:B} return new HttpResponseMessa

public async Task Register(AllenRegistration model)

{

1.


Will return 400 Error 

  return Request.CreateResponse(HttpStatusCode.BadRequest);


2.

Will return Json Type like   {"return1":"A","returnB"L:"B"}

return new HttpResponseMessage(HttpStatusCode.OK)

            {
                Content = new ObjectContent(new
                {
                    return1="A",

                    return2="B"
                }, Configuration.Formatters.JsonFormatter)
            };
        }


asp.net core WebApi 返回 HttpResponseMessage

asp.net core WebApi 返回 HttpResponseMessage

ASP.NET WebApi 2 中的示例代码:

[Route("values/{id}")]
public async Task<HttpResponseMessage> Get(string id)
{
    var response = Request.CreateResponse(HttpStatusCode.OK);
    var accept = Request.Headers.Accept;
    var result = await _valuesService.Get(id);

    if (accept.Any(x => x.MediaType == "text/html"))
    {
        response.Content = new StringContent(result, Encoding.UTF8, "text/html");
    }
    else
    {
        response.Content = new StringContent(result, Encoding.UTF8, "text/plain");
    }
    return response;
}

ASP.NET Core WebApi 中的示例代码:

[Route("values/{id}")]
public async Task Get(string id)
{
    var accept = Request.GetTypedHeaders().Accept;
    var result = await _valuesService.Get(id);
    var data = Encoding.UTF8.GetBytes(result);
    if (accept.Any(x => x.MediaType == "text/html"))
    {
        Response.ContentType = "text/html";
    }
    else
    {
        Response.ContentType = "text/plain";
    }
    await Response.Body.WriteAsync(data, 0, data.Length);
}

可以看到,改变还是很大的,主要是两方面:

没有了 Request.CreateResponse,获取 Accept 需要通过 Request.GetTypedHeaders()。 没有返回值,而是直接通过数据流的方式写入到 Response.Body 中。

asp.net – .NET Web API HttpResponseMessage模式?

asp.net – .NET Web API HttpResponseMessage模式?

所以我看到Web API 2控制器返回HttpResponse和实际对象.例:
public HttpResponseMessage Get(string id)
    {
        var app = apps.Single(c => c.Id == id);

        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ObjectContent<object>(app,Configuration.Formatters.JsonFormatter)
        };
    }

要么

public Application Get(string id)
    {
        return apps.Single(c => c.Id == id);
    }

我的问题是“正确”的方式? #2要短得多但是#1更好或#2自动做#1#?

解决方法

请参阅 this和 this SO问题.

两种情况下的响应都是相同的(HttpResponseMessage).

HttpResponseMessage允许您使用HTTP协议(例如,通过Headers属性)并统一您的返回类型.

返回CLR类型可以更具可读性,但是您可以放松使用不同状态代码返回不同类型的灵活性,除非您使用动态或对象来抵消返回特定类型的目的.

就个人而言,我更喜欢使用IHttpActionResult(在v2中添加)并在控制器操作上为预期的返回类型指定ResponseTypeAttribute以提高可读性.

[HttpGet]
[ResponseType(typeof(Portfolio))]
public IHttpActionResult GetPortfolio([FromUri] long id)
{
    // get portfolio

    return Ok(portfolio);
}

您可以使用默认的IHttpActionResult实现轻松地操作响应消息(以RESTful方式)(请参阅上面的OkResult).避免自己构造HttpResponseMessage也可以保持代码清洁. Here是关于IHttpActionResult的官方文章,here是关于HttpResponseMessage和IHttpActionResult的有趣的SO对话.

今天关于asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?的分享就到这里,希望大家有所收获,若想了解更多关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?等相关知识,可以在本站进行查询。

本文标签: