imabdullah
imabdullah

Reputation: 347

How to edit body of HTTP POST request in .net core?

I need to edit data(body) of HTTP POST request before storing it to DB.

I am beginner and trying to save data into database but before saving I need to fetch data using value of one variable in received request

Extra Information : This may help

This is http post body

 {
    "message": "K E ?",
    "senderId": "c24617c6-4680-4a8b-a010-cdf969ddd3f8",
    "dateTime": "2018-09-01T20:06:06",
    "request": "9cb31157-86b4-4eeb-b770-fc3a86f5f906"
}

here request is object and this "9cb311......f5f906" is request id what I want to do is to fetch object of request using this request id so I can store the data into DB

Something Like this

 [HttpPost]
    public async Task<IActionResult> PostConversation([FromBody] Conversation conversation)
    {
        Request str = conversation.Request;

        var request = (from  r in _context.Requests 
                            where r == str
                            select r);

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Conversation.Add(conversation);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetConversation", new { id = conversation.ConversationUniqueId }, conversation);

    }

DB Model

 public class Conversation
{
    public Request Request { get; set; }
}
public class Request
{
    public string RequestId { get; set; }
}

Sorry if I am not clear

Upvotes: 0

Views: 210

Answers (2)

Anduin Xue
Anduin Xue

Reputation: 3727

It seems that you want to bind multiple conversations to one request and save them in the database.

Edit your model like this:

public class Conversation
{
    public int ConversationId { get; set; }

    public string RequestId { get; set; }
    [ForeignKey(nameof(RequestId))]
    public Request Request { get; set; }
}
public class Request
{
    public string RequestId { get; set; }

    [InverseProperty(nameof(Conversation.Request))]
    public IEnumerable<Conversation> Conversations{ get; set; }
}

That will make EF understand what you wanna to do.

And modify your code in your action like:

    [HttpPost]
    public async Task<IActionResult> PostConversation([FromBody] Conversation conversation)
    {
        string requestId = conversation.RequestId;

        var request = (from r in _context.Requests
                       where r.RequestId == requestId
                       select r);

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // Reject if given requestid can not find a request.
        if (request == null)
        {
            return NotFound();
        }

        _context.Conversation.Add(conversation);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetConversation", new { id = conversation.ConversationUniqueId }, conversation);

    }

This will save the conversation in your database and also link it to that request.

Upvotes: 0

Edward
Edward

Reputation: 29996

To save Request to Conversation by requestId, there is no need to do like this, you could define navigation property.

        public class Conversation
    {
        public string RequestId { get; set; }
        public virtual Request Request { get; set; }
    }
    public class Request
    {
        public string Id { get; set; }
    }

Then, you could save your current request directly with RequestId without retriving Request object from database.

Upvotes: 1

Related Questions