Я на самом деле разработчик для iOS, и у меня мало знаний о разработке для Android. и мне нужно повторить запрос, отправленный из приложения Android на сервер, в моем приложении iOS.
в бэкэнд-API требование похоже на изображение ниже в почтальоне, мне нужно отправить что-то вроде закодированной строки в значении ключа 'products':
вот модификатор:
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
);
и вот журнал, как вы можете видеть, как показано синей стрелкой. он автоматически кодируется при отправке данных на сервер
но если я войду, 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
где находится процесс кодирования при отправке данных с использованием дооснащения?