После обновления Xamarin.forms возникла проблема с данными json из Api

#laravel #xamarin #xamarin.forms

#laravel #xamarin #xamarin.forms

Вопрос:

Я использую Laravel 7.0 для серверной части моих приложений Xamarin. До тех пор, пока я не обновил xamarin.forms, он работал нормально. Теперь я не могу показать продукты в категории. вот как я получаю продукты

 $products = Product::select("products.*",DB::raw("COALESCE(cart.quantity,0) as cart_quantity"),DB::raw("COALESCE(cart.id,0) as cart_id"),DB::raw("(0) as SecondLoad"),DB::raw("(0) as checkPickerLoad"),DB::raw("IF ((select count(favourite_products.product_id) from favourite_products where favourite_products.product_id = products.id and favourite_products.user_id='$user_id' and favourite_products.status='AC') > 0,'Favourites_selected.png','Favourites.png') as favourite"),DB::raw("(select product_variations.price from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as price"),DB::raw("(select product_variations.special_price from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as special_price"),DB::raw("(select round((product_variations.price - product_variations.special_price)*100 / product_variations.price) from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as discount"))->join('product_variations', 'product_variations.product_id', '=', 'products.id')->leftJoin("cart", function ($join) use ($user_id) {
            $join->on("cart.product_id", "=", "products.id");
            $join->where(["cart.user_id" => $user_id, "cart.status" => "AC"]);
        })->with(['get_product_variations' => function ($q) {
            $q->with(['product_units' => function ($q) {
                $q->select('id', 'name', 'h_name');
            }])->where('status', 'AC');
        }, 'product_brand' => function ($query) {
            $query->select('id', 'name as brand_name');
        }])
        ->where(['products.status' => 'AC', 'category_id' => $request->category_id, 'product_variations.status' => 'AC'])
        ->groupBy('products.id')
        ->orderBy('products.name')
        ->get();
  

это формат, который я получаю.

 {
"status": 200,
"message": "OK",
"data": [{
            "id": 180,
            "name": "Blueberry Juice",
            "category_id": 6,
            "description": "Juice","image":"http://127.0.0.1:8000/uploads/products/5f150c6847a77_Wild-Blueberry-Juice.jpg","is_featured":0,"is_quick_grab":0,"is_offered":0,"status":"AC","brand_id":1,"h_name":null,"h_description":null,"price":"2.00","quantity":0,"cgst":"0.00","sgst":"0.00","igst":"0.00","created_at":"2020-08-15T11:35:27.000000Z","updated_at":"2020-08-15T11:35:27.000000Z","cart_quantity":0,"cart_id":0,"SecondLoad":0,"checkPickerLoad":0,"favourite":"Favourites.png","special_price":"1.00","discount":"50","get_product_variations":[{"id":7,"product_id":180,"unit_id":6,"weight":1,"price":"2.00","special_price":"1.00","status":"AC","created_at":"2020-07-20T03:16:01.000000Z","updated_at":"2020-07-20T03:16:01.000000Z","product_units":{"id":6,"name":"Each","h_name":""}}],"product_brand":{"id":1,"brand_name":"Local"}}]}
  

К сожалению, на странице сейчас не отображаются какие-либо данные… Если я изменю код на этот

 $products = Product::join('product_variations', 'product_variations.product_id', '=', 'products.id')->leftJoin("cart", function ($join) use ($user_id) {
            $join->on("cart.product_id", "=", "products.id");
            $join->where(["cart.user_id" => $user_id, "cart.status" => "AC"]);
        })->with(['get_product_variations' => function ($q) {
            $q->with(['product_units' => function ($q) {
                $q->select('id', 'name', 'h_name');
            }])->where('status', 'AC');
        }, 'product_brand' => function ($query) {
            $query->select('id', 'name as brand_name');
        }])
        ->where(['products.status' => 'AC', 'category_id' => $request->category_id, 'product_variations.status' => 'AC'])
        ->groupBy('products.id')
        ->orderBy('products.name')
        ->get();
  

что означает удаление select («***»), после чего он снова работает, конечно, с большим количеством недостающей информации. Я работал над этим последние 4 дня. Я искал везде, во всех группах xamarin и т.д.. Ни за что.. все это произошло после обновления xamarin.forms до последней версии. по какой-то причине, когда я отправляю данные с помощью select, они не могут их обработать..

Я также добавляю свою логику продукта. Проблема связана с задачами Product, ProductDetail и SearchProduct.

  public class ProductLogic
{
    public static async Task<ProductResponce> GetProducts(int CategoryId, string UserId)
    {
        ProductResponce productResponce;
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var url = string.Format(Config.GetProductList, CategoryId, UserId);
            var response = await httpClient.GetAsync(url);
            var json = await response.Content.ReadAsStringAsync();
            productResponce = JsonConvert.DeserializeObject<ProductResponce>(json);
        }

        return productResponce;
    }

    public static async Task<ProductDetailResponce> GetProduct(int ProductId)
    {
        ProductDetailResponce product = new ProductDetailResponce();
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var url = string.Format(Config.GetSingleProduct, ProductId);
            var response = await httpClient.GetAsync(url);
            var json = await response.Content.ReadAsStringAsync();

            var productDetail = JsonConvert.DeserializeObject<ProductDetailResponce>(json);
            product = productDetail;
        }

        return product;
    }

    public static async Task<SearchProductResponce> GetSearchProducts(string text, string UserId)
    {
        SearchProductResponce productResponce;
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var url = string.Format(Config.GetSearchProductList, text, UserId);
            var response = await httpClient.GetAsync(url);
            var json = await response.Content.ReadAsStringAsync();
            productResponce = JsonConvert.DeserializeObject<SearchProductResponce>(json);
        }

        return productResponce;
    }

    public static async Task<FavouriteProductResponce> AddFavouriteProduct(Dictionary<string, int> data)
    {
        FavouriteProductResponce favouriteProduct;
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var jsonData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            var response = await httpClient.PostAsync(Config.AddFavourite, jsonData);
            var json = await response.Content.ReadAsStringAsync();
            favouriteProduct = JsonConvert.DeserializeObject<FavouriteProductResponce>(json);
        }
        return favouriteProduct;
    }

    public static async Task<FavouriteProductListResponse> GetFavouriteProducts(int user_id)
    {
        FavouriteProductListResponse favouriteProduct;
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var url = string.Format(Config.GetFavouriteProducts, user_id);
            var response = await httpClient.GetAsync(url);
            var json = await response.Content.ReadAsStringAsync();
            favouriteProduct = JsonConvert.DeserializeObject<FavouriteProductListResponse>(json);
        }
        return favouriteProduct;
    }

    public static async Task<DeleteFavouriteProductResponce> DeleteFavouriteProduct(Dictionary<string, string> data)
    {
        DeleteFavouriteProductResponce deleteFavouriteProduct;
        using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
        {
            var jsonData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            var response = await httpClient.PostAsync(Config.DeleteFavourite, jsonData);
            var json = await response.Content.ReadAsStringAsync();
            deleteFavouriteProduct = JsonConvert.DeserializeObject<DeleteFavouriteProductResponce>(json);
        }
        return deleteFavouriteProduct;
    }
}
  

Комментарии:

1. Где ваш код Xamarin, который вызывает веб-сервис и десериализует данные? Если ваш формат json не изменился, маловероятно, что обновление Forms приведет к нарушению кода, но, не видя его, невозможно сказать наверняка.

2. Ваши различные вызовы DeserializeObject все еще работают правильно? Это многоступенчатый процесс (запрашивает данные, php отвечает на запрос, десериализует, привязывает к пользовательскому интерфейсу и т.д.), И вам нужно начать с определения того, какой шаг вызывает проблему.

3. в этом фрагменте кода favorite, favoriteProductList и deleteFavouriteProduct работают нормально.. если я изменю код api, то код будет работать нормально (со всеми отсутствующими полями, которые я удаляю из api)..

4. Вы не отвечаете на мой вопрос. Для методов, которые «не работают», вам нужно определить, где они выходят из строя. Вам нужно пошагово просмотреть код в отладчике и определить, в какой конкретный момент они перестают работать.