Почему моя строка JSON автоматически кодируется при отправке данных на сервер с помощью модернизации? - PullRequest
0 голосов
/ 27 апреля 2019

Я на самом деле разработчик для iOS, и у меня мало знаний о разработке для Android. и мне нужно повторить запрос, отправленный из приложения Android на сервер, в моем приложении iOS.

в бэкэнд-API требование похоже на изображение ниже в почтальоне, мне нужно отправить что-то вроде закодированной строки в значении ключа 'products':

enter image description here

вот модификатор:

public class APIClient {


    // Base URL for API Requests
    private static final String BASE_URL = ConstantValues.ECOMMERCE_URL + "app/";

    private static APIRequests apiRequests;


    // Singleton Instance of APIRequests
    public static APIRequests getInstance() {
        if (apiRequests == null) {

            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            API_Interceptor apiInterceptor = new API_Interceptor.Builder()
                    .consumerKey(Utilities.getMd5Hash(ConstantValues.ECOMMERCE_CONSUMER_KEY))
                    .consumerSecret(Utilities.getMd5Hash(ConstantValues.ECOMMERCE_CONSUMER_SECRET))
                    .build();

            OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                    .connectTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(60, TimeUnit.SECONDS)
                    .addInterceptor(apiInterceptor)
                    .addInterceptor(httpLoggingInterceptor)
                    .build();


            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();


            apiRequests = retrofit.create(APIRequests.class);

            return apiRequests;
        }
        else {
            return apiRequests;
        }
    }

}

вот интерфейс для совершения звонка:

    @FormUrlEncoded
    @POST("checkproductavailability")
    Call<AvailableProductsResponse> checkProductsAvailability(
            @Field("products") String products,
            @Field("status") int productStatus
    );

вот код для отправки запроса на сервер:

 Call<AvailableProductsResponse> call = APIClient.getInstance().checkProductsAvailability(
                new Gson().toJson(cartItemsList)
                , ConstantValues.STATUS_INAVAILABLE_PRODUCTS
        );

        call.enqueue(new Callback<AvailableProductsResponse>() {
            @Override
            public void onResponse(Call<AvailableProductsResponse> call, retrofit2.Response<AvailableProductsResponse> response) {
                AlertDialog.Builder ab = new AlertDialog.Builder(getActivity());
                ab.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });

                if (response.isSuccessful()) {
                    if (200 == response.body().getSuccess()) {

                        AvailableProductsResponse.AvailableProductsResponseData aprd = response.body().getData();
                        List<AvailableProductInfo> inAvailableProductsList = aprd.getProductsList();

                        if (0 < inAvailableProductsList.size()) {
                            showInavailableProductsDialog(inAvailableProductsList);
                        } else {
                            // Navigate to Shipping_Address Fragment
                            Fragment fragment = new Checkout();
                            FragmentManager fragmentManager = getFragmentManager();
                            fragmentManager.beginTransaction().replace(R.id.main_fragment, fragment)
                                    .addToBackStack(getString(R.string.actionCart))
                                    .commit();
                        }
                    }
                } else {
                    Log.e(TAG + ".onResponse: ", "message: " + response.message());
                    ab.setMessage(R.string.text_failed_connecting_server);
                    ab.create().show();
                }

                mDialogLoader.hideProgressDialog();
            }

            @Override
            public void onFailure(Call<AvailableProductsResponse> call, Throwable t) {
                mDialogLoader.hideProgressDialog();
                Toast.makeText(getContext(), "NetworkCallFailure : "+t, Toast.LENGTH_LONG).show();
            }
        });

Я предполагаю, что строка для ключа 'products' при отправке запроса происходит от new Gson().toJson(cartItemsList) из этого:

Call<AvailableProductsResponse> call = APIClient.getInstance().checkProductsAvailability(
                new Gson().toJson(cartItemsList)
                , ConstantValues.STATUS_INAVAILABLE_PRODUCTS
        );

и вот журнал, как вы можете видеть, как показано синей стрелкой. он автоматически кодируется при отправке данных на сервер enter image description here

но если я войду, Gson().toJson(cartItemsList) вот так

String json = new Gson().toJson(cartItemsList);
        Log.d("checkxxx",json)

результат в обычной строке JSON, такой как:

[
  {
    "customers_basket_date_added": "2019-04-27 09:40:35",
    "customers_basket_id": 3,
    "customers_basket_product": {
      "attributes": [],
      "attributes_price": "0.0",
      "categories_id": 6,
      "categories_name": "Perawatan Rambut",
      "customers_basket_quantity": 2,
      "images": [],
      "isSale_product": "0",
      "language_id": 0,
      "motorist_id": 0,
      "motorist_name": "",
      "id_jenis_products": 0,
      "qty_orders_max": 40,
      "qty_orders_min": 2,
      "qty_promo_bought": 0,
      "trans_limit": 0,
      "trans_live": 0,
      "manufacturers_id": 0,
      "parent_id": 0,
      "products_description": "Dijual per Renteng<br/> <br/>\r\nMinimal pembelian 2 Renteng <br/>\r\n1 Dus isi 20 Renteng<br/><br/>",
      "final_price": "4500.0",
      "products_id": 28,
      "products_image": "resources/assets/images/product_images/1548787433.emeron-hijab-clean-n-fresh.jpg",
      "products_liked": 0,
      "products_model": "",
      "products_name": "Emeron Hijab Clean & Fresh Sachet 12 ml",
      "products_ordered": 0,
      "products_price": "4500.0",
      "products_quantity": 2094,
      "products_status": 0,
      "products_tax_class_id": 0,
      "products_viewed": 0,
      "products_weight": "1",
      "products_weight_unit": "Rtg",
      "sort_order": 0,
      "tax_class_id": 0,
      "tax_priority": 0,
      "tax_rates_id": 0,
      "tax_zone_id": 0,
      "total_price": "9000.0"
    },
    "customers_basket_product_attributes": [],
    "customers_id": 0
  }
]

так почему JSON, как указано выше, автоматически превращается в закодированную строку, подобную этой

products=%5B%7B%22customers_basket_date_added%22%3A%222019-04-22%2012%3A28%3A41%22%2C%22customers_basket_id%22%3A4%2C%22customers_basket_product%22%3A%7B%22attributes%22%3A%5B%5D%2C%22attributes_price%22%3A%220.0%22%2C%22categories_id%22%3A8%2C%22categories_name%22%3A%22Kemasan%20Botol%22%2C%22customers_basket_quantity%22%3A6%2C%22images%22%3A%5B%5D%2C%22isSale_product%22%3A%220%22%2C%22language_id%22%3A0%2C%22motorist_id%22%3A0%2C%22motorist_name%22%3A%22%22%2C%22id_jenis_products%22%3A0%2C%22qty_orders_max%22%3A12%2C%22qty_orders_min%22%3A6%2C%22qty_promo_bought%22%3A0%2C%22trans_limit%22%3A0%2C%22trans_live%22%3A0%2C%22manufacturers_id%22%3A0%2C%22parent_id%22%3A0%2C%22products_description%22%3A%22PROMO%20APRIL%20MURAH%21%5Cu003cbr%5Cu003e%5Cr%5CnRekomendasi%20harga%20jual%20warung%20Rp%203.500%2Fbotol%5Cu003cbr%5Cu003e%5Cr%5CnUntung%20Rp%201.300%20%2859%25%29%5Cu003cbr%5Cu003e%5Cr%5CnPembelian%20min%206%20botol%2C%20maks%2012%20botol%22%2C%22final_price%22%3A%222200.0%22%2C%22products_id%22%3A140%2C%22products_image%22%3A%22resources%2Fassets%2Fimages%2Fproduct_images%2F1555722212.promo-larutan-kakitiga.jpg%22%2C%22products_liked%22%3A0%2C%22products_model%22%3A%22%22%2C%22products_name%22%3A%22PROMO%20Cap%20Kaki%20Tiga%20Botol%20200%20ml%22%2C%22products_ordered%22%3A0%2C%22products_price%22%3A%222200.0%22%2C%22products_quantity%22%3A1%2C%22products_status%22%3A0%2C%22products_tax_class_id%22%3A0%2C%22products_viewed%22%3A0%2C%22products_weight%22%3A%221%22%2C%22products_weight_unit%22%3A%22Btl%22%2C%22sort_order%22%3A0%2C%22tax_class_id%22%3A0%2C%22tax_priority%22%3A0%2C%22tax_rates_id%22%3A0%2C%22tax_zone_id%22%3A0%2C%22total_price%22%3A%2213200.0%22%7D%2C%22customers_basket_product_attributes%22%3A%5B%5D%2C%22customers_id%22%3A0%7D%5D&status=0

где находится процесс кодирования при отправке данных с использованием дооснащения?

...