Получить идентификатор последнего POST API отдыха с помощью Entity Framework - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно иметь доступ к идентификатору нового сообщения.Я буду использовать этот идентификатор, чтобы заполнить другое поле с именем LocationId, например: «L» + id = LocationId (пример L22), где 22 - это идентификатор нового сообщения.Вот код моего почтового запроса:

private async void BtnSubmit_Clicked(object sender, EventArgs e)
    {
        var imageArray = FilesHelper.ReadFully(file.GetStream());
        file.Dispose();

        var location = new Models.Location()
        {               
            LocationName = EntName.Text,
            ImageArray = imageArray,
        };
        ApiServices apiServices = new ApiServices();
        bool response = await apiServices.PostLocation(location);

        bool response2 = await apiServices.InputLocationId(id, location);
        if (!response || !response2)
        {
            await DisplayAlert("Alert", "Something wrong", "Cancel");
        }
        else
        {
            await DisplayAlert("Hi", "Your record has beed added successfully", "Alright");
        }
        await Navigation.PushAsync(new SetupPage());

Это на стороне клиента.У меня есть все API, созданные (такие как PostLocation и InputLocationId) на SQL Server Azure.Это мобильное приложение для инвентаризации, созданное с использованием Xamarin.

public async Task<bool> PostLocation(Location location)
    {
        var json = JsonConvert.SerializeObject(location);
        var httpClient = new HttpClient();
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Settings.AccessToken);
        var wimsApiUrl = "http://xxxxxxx.azurewebsites.net/api/Locations";
        //Get the Body of the Post
        var body = await httpClient.PostAsync(wimsApiUrl, content);
        //Convert it to a string
        var jString = await body.Content.ReadAsStringAsync();
        //Place it in a JSON Object
        JObject joResponse = JObject.Parse(jString);
        //Parse the JSON Object into an Int from a String
        var id = int.Parse(joResponse["Id"].ToString());
        //This is used in my other script to Put the LocationId of Lxx
        AddNewLocationPage.NewLocationId = id;

        return body.IsSuccessStatusCode;


    }

API местоположения My Post:

// POST: api/Locations
    [ResponseType(typeof(Location))]
    public IHttpActionResult PostLocation([FromBody] Location location)
    {
        string userId = User.Identity.GetUserId();

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var stream = new MemoryStream(location.ImageArray);
        var guid = Guid.NewGuid().ToString();
        var file = String.Format("{0}.jpg", guid);
        var folder = "~/Content/Images";
        var fullPath = String.Format("{0}/{1}", folder, file);
        var response = FilesHelper.UploadPhoto(stream, folder, file);
        if (response)
        {
            location.ImagePath = fullPath;
        }
        var newLocation = new Location()
        {
            LocationName = location.LocationName,
            User = userId,
            ImagePath = location.ImagePath

        };
        db.Locations.Add(newLocation);
        db.SaveChanges();
        return Ok(new { newLocation.Id});
    }

Затем я возьму идентификатор и добавлю его в этот запрос на размещение, чтобы создатьLocationId:

public async Task<bool> InputLocationId(int id, Location location)
    {
        var json = JsonConvert.SerializeObject(location);
        var httpClient = new HttpClient();
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Settings.AccessToken);
        var wimsApiUrl = "http://xxxxxxx.azurewebsites.net/api/Locations/InputLocationId/";
        var completeUrl = String.Format("{0}{1}", wimsApiUrl, id);
        var response = await httpClient.PutAsync(completeUrl, content);
        return response.IsSuccessStatusCode;
    }

API InputLocationId автоматически создаст LocationId.Вот мой API:

// PUT: api/Locations/5
    [HttpPut]
    [ResponseType(typeof(void))]
    [Route("api/Locations/InputLocationId/{id}")]
    public IHttpActionResult InputLocationId(int id, [FromBody] Location location)
    {
        //string userId = User.Identity.GetUserId();

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

        var result = db.Locations.FirstOrDefault(locationId => locationId.Id == id);
        var resultant = String.Format("L{0}", id);

        location.LocationName = location.LocationName;
        result.LocationId = resultant;

        db.SaveChanges();
        return Ok("The record has been updated");
    }

Я просто застрял в том, как получить доступ к этому идентификатору!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Возвращаемые значения должны быть преобразованы в строку из HttpResponseMessage.

var body = await httpClient.PostAsync(wimsApiUrl, content);
var jString = await body.Content.ReadAsStringAsync();

Затем мы можем поместить его в объект JSON:

JObject joResponse = JObject.Parse(jString);

Теперь этот объект JSON можноразобрать в Int.Обратите внимание, что его необходимо преобразовать в строку.

var id = int.Parse(joResponse["Id"].ToString());
0 голосов
/ 14 февраля 2019
// get the response body
var body = await httpClient.PostAsync(wimsApiUrl, content);

// load it into a JSON object using Newtonsoft
JObject data = JObject.Parse(body);

// get the id
var id = int.Parse(data["id"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...