C# APİ'YE List türünde parametre gönderme hatası


Merhabalar. Yukarıda api’ye “List” türünde parametre gönderirken string’e çevirmek zorunda kalıyorum çünkü “PostAsync()” methodu content olarak string kabul ediyor. Bu yüzden tahminimce listenin yapısı bozuluyor veya api liste olduğunu algıyamıyor. İnternette araştırdığımda json serialize çevirip öyle atmışlardı fakat bende denedim jsona çevirip öyle attım yine sonuç değişmedi. Diğer parametrelerde sıkıntı yok sadece “List” türündeki parametrelerde sorun yaşıyorum…

Aldığım response;

Merhabalar,

Oncelikle bkz: Soru Sorarken Sıkça Düşülen Hatalar #4 ve #6

  • API HTTP form encoding kullaniyor.
  • JSON’a serialize edip yollamak mumkun. Alan tarafin JSON’dan deserialize etmesi lazim. Ama o zaman niye form encoding kullaniyoruz?
  • Baska bir sekilde serialize/deserialize da mumkun, fakat yine encoding karistirmis oluyoruz.
  • API’nin tamamini JSON’a cevirmek daha guzel ve temiz bir cozum.
  • Form encoding icinde array yollamak mumkun, lakin hede[] = 1, hede[] = 2 seklinde ayni keye sahip KVP’ler yollamak lazim. Dictionary ile olmaz, List<KVP> ile olur.

Bu soruyu mevcut bilgiyle cevaplayabildik, fakat bir dahaki sefere giden istegi ve varsa response veren kodu da paylasmaniz yardimci olacaktir. Yazi olarak.

StringBuilder baseUrl = new StringBuilder(“http://localhost:5058/api/Orders”); // URL AND PARAMETRES
HttpClient client = new HttpClient(); // HTTPCLİENT

        HttpResponseMessage httpResult = new HttpResponseMessage();

        try
        {
            var parametreValues = new List<KeyValuePair<string, string>>();
            parametreValues.Add(new KeyValuePair<string, string>("userID", userID.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("addressID", addressID.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("paymentID", paymentID.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("products", productIDS.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("shipperID", shipperID.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("trackingID", trackingID.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("orderDate", orderDate.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("totalPrice", totalPrice.ToString()));
            parametreValues.Add(new KeyValuePair<string, string>("quantities", quantity.ToString()));

            var json = new JavaScriptSerializer().Serialize(parametreValues);
            HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");

            httpResult = await client.PostAsync(baseUrl.ToString(), content);
        }

        catch (Exception ex)
        {
            return ex.Message;
        }

List olarak yapıp ve json çevirip yolladım ama bu sefer “not valid” değil “is required” hatası alıyorum list olan parametreler için.

RESPONSE;
Order Result : {
“type”:“RFC 7231: Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”,
“title”:“One or more validation errors occurred.”,
“status”:400,
“traceId”:“00-92d10180f86551a0f62b61e91ba6ca59-45dc4f3d7821594a-00”,
“errors”:{
“products”:[“The products field is required.”],
“quantities”:[“The quantities field is required.”]
}
}

bkz: Soru Sorarken Sıkça Düşülen Hatalar #1

Gecen cevapta dedigim gibi, giden istegi ve Orders’in kodunu gormek lazim.

BaseController;
[Route(“Orders”)]
[HttpPost]
public JsonResult addToOrders([FromForm] AddToOrderDto dto)
{
var result = homeServices.AddToOrderService(dto);
return result;
}

Orders REPO;
public JsonResult AddToOrder(AddToOrderDto dto)
{
Dictionary<string, dynamic> responseDict = new Dictionary<string, dynamic>();
Dictionary<string, dynamic> orderResponse = new Dictionary<string, dynamic>();
Dictionary<string, dynamic> deliveryResponse = new Dictionary<string, dynamic>();
Dictionary<string, dynamic> quantityResponse = new Dictionary<string, dynamic>();

        try
        {
            // ORDER
            var order = new Order()
            {
                UserId = dto.userID,
                OrderDate = dto.orderDate,
                UpdateDate = DateTime.Now,
                PaymentId = dto.paymentID,
                AddressId = dto.addressID,
                TotalPrice = dto.totalPrice,
                ShipperId = dto.shipperID,
            };
            db.Orders.Add(order); db.SaveChanges();
            orderResponse.Add("OrderID", order.OrderId.ToString());
            orderResponse.Add("User", db.UsersTbls.Where(u => u.UserId == order.UserId).Select(s => new { s.UserMail, s.UserId }).FirstOrDefault());
            orderResponse.Add("OrderDate", order.OrderDate.ToString());
            orderResponse.Add("UpdateDate", order.UpdateDate.ToString());
            orderResponse.Add("Payment", db.Payments.Where(p => p.PaymentId == order.PaymentId).Select(s => new { s.PaymentFirstName, s.PaymentLastName, s.PaymentCardNo }).FirstOrDefault());
            orderResponse.Add("Address", db.Addresses.Where(a => a.AddressId == order.AddressId).Select(s => new { s.AddressUserFirstName, s.AddressUserLastName, s.AddressPhone, s.AddressHeader, s.AddressFullAddress, s.AddressCountry, s.AddressCity, s.AddressDistrict }).FirstOrDefault());
            orderResponse.Add("Shipper", db.Shippers.Where(s => s.ShipperId == order.ShipperId).Select(s => new { s.CompanyName, s.Phone, s.Email }).FirstOrDefault());
            orderResponse.Add("TotalPrice", order.TotalPrice);

            // DELİVERİES
            foreach (var zipResult in dto.products.Zip(dto.quantities, (x, y) => (productID: x, quantity: y)))
            {
                var delivery = new Delivery()
                {
                    ProductId = zipResult.productID,
                    OrderId = order.OrderId,
                    CancelllationStatu = 0,
                    RebateStatu = 0,
                    UpdateDate = DateTime.Now,
                    TrackingId = dto.trackingID,
                    DepartureDate = DateTime.Now,
                    DeliveryDate = DateTime.Now,
                };
                db.Deliveries.Add(delivery); db.SaveChanges();
                deliveryResponse.Add(delivery.DeliveryId.ToString(), new Dictionary<string, dynamic>() {
                {"Product", db.Products.Where(p => p.ProductId == delivery.ProductId).Select(s => new {s.ProductId,s.ProductName, s.ProductDesc, s.ProductColor, s.ProductDimensions}).FirstOrDefault() } ,
                {"ProductImage", db.ProductPictures.Where(p => p.ProductId == delivery.ProductId).Select(s => s.PictureDictioneryPath).FirstOrDefault()},
                {"CancellationStatu", delivery.CancelllationStatu},
                {"RebateStatu", delivery.RebateStatu},
                {"UpdateDate", delivery.UpdateDate },
                {"Tracking", db.TrackingTbls.Where(t => t.TrackingId == delivery.TrackingId).Select(s => s.TrackingStatu).FirstOrDefault() }
            });


                for (int i = 0; i < zipResult.quantity; i++)
                {
                    var quantity = new Quantity()
                    {
                        ProductId = delivery.ProductId,
                        DeliveryId = delivery.DeliveryId,
                        CancellationStatu = 0,
                        RebateStatu = 0
                    };
                    db.Quantities.Add(quantity); db.SaveChanges();

                    if (quantity.DeliveryId == delivery.DeliveryId)
                    {
                        quantityResponse.Add(quantity.Id.ToString(), new Dictionary<string, dynamic>()
                    {
                        {"QuantityID", quantity.Id },
                        {"DeliveryID", quantity.DeliveryId },
                        {"ProductID", quantity.ProductId},
                        {"CancellationStatu",quantity.CancellationStatu },
                        {"RebateStatu", quantity.RebateStatu },
                    });
                    }


                    if (i == dto.quantities.Count() - 1) { deliveryResponse[quantity.DeliveryId.ToString()].Add("Quantity", new List<Dictionary<string, dynamic>>() { { quantityResponse } }); }
                }
                quantityResponse = new Dictionary<string, dynamic>();
            }

            db.SaveChanges();
            responseDict.Add("Statu", true);
            responseDict.Add("Order", orderResponse);
            responseDict.Add("Deliveries", deliveryResponse);
            return new JsonResult(responseDict);
        }

        catch (Exception EX)
        {
            responseDict = new Dictionary<string, dynamic>();
            responseDict.Add("Statu", false);
            responseDict.Add("Error", EX.Message);
            return new JsonResult(responseDict);
        }
    }

GİDEN İSTEK;
var orderResult = await _ap.AddToOrders(responseUserId, basketConfirmedProductIDS, Convert.ToInt32(basketNewPaymentData[“PaymentID”]), Convert.ToInt32(basketNewAddressData[“AddressID”]), 1, DateTime.Now, totalBasketPrice, quantityList, 1);