Мне нужно иметь доступ к идентификатору нового сообщения. Я буду использовать этот идентификатор для заполнения другого поля с именем 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) на Azure SQL Server. Это для мобильного приложения инвентаризации, созданного с использованием 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 местоположения моего поста:
// 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");
}
Я просто застрял в том, как получить доступ к этому идентификатору!
Будет ли это API PostLocation на стороне сервера или PostLocation на стороне клиента? Мне это нужно, чтобы использовать его на стороне клиента для следующего запроса на размещение. Какой будет синтаксис? (Спасибо за ответ)
сервер должен будет вернуть идентификатор клиенту. Я считаю, что после вызова SaveChanges вы можете просто проверить свойство ID вашей модели.
Я изменил // POST: api/Locations, добавив «int newId = location.Id;» после сохранения изменений. Как мне получить доступ к этому на стороне клиента?
Вам не нужен int location.Id, вам понадобится newLocation.Id. Это сущность, связанная с DbContext. Я рекомендую нет передавать объекты туда и обратно между клиентом и сервером. Вы должны проверить все данные, отправляемые на сервер, чтобы убедиться, что они действительны для конкретного запроса и не были злонамеренно изменены клиентом с помощью отладчика или посредника.
вернуть Ok (новый {newLocation.Id}); Это работает, и в теле почтальона я получаю {"Id":22}. Как мне получить доступ к этому возвращаемому значению (newLocation.Id) на клиенте, чтобы его можно было отправить в запросе Put сразу после этого? Этот newLocation.Id будет объединен с «L», чтобы получить «L22», который будет обозначать, что это местоположение, а не что-то еще.





// 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"]);
Ты навел меня на правильный путь с хлебными крошками. Я многому научился за последние два дня, так что спасибо за это. Просто нужно было убедиться, что данные были в правильном формате.
Возвраты должны быть преобразованы в строку из 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());
почему у вас PostLocation не возвращает идентификатор нового местоположения?