티스토리 뷰
Android
[Android] Retrofit2 POST 방법(@Part, @Field, @Body, @Multipart, @FormUrlEncoded)
EnvEng10 2020. 11. 25. 18:33반응형
Retrofit2 를 이용해서 POST 를 하고자 할때 크게 3가지 방법이 있다.
1. @Part
- @Part 는 파일을 POST 할때 쓰인다(이미지라 가정하고 작성)
- @Part 를 사용하려면 @MultiPart 도 함께 써야한다.
@Multipart
@POST("picture/upload")
Call<ImageResponse> postImage(@Part("key") RequestBody key,
@Part("id") RequestBody id,
@Part("name") RequestBody name,
@Part MultipartBody.Part image);
private void uploadImage(String mKey, int mId, String mName) {
File file = new File(이미지 경로);
RequestBody key = RequestBody.create(MultipartBody.FORM, mKey);
RequestBody id = RequestBody.create(MultipartBody.FORM, String.valueOf(id));
RequestBody name = RequestBody.create(MultipartBody.FORM, name);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
apiService.postImage(key, id, name, body).enqueue(new Callback<ImageResponse>() {
@Override
public void onResponse(Call<ImageResponse> call, Response<ImageResponse> response) {
Log.d(TAG, "Post image successfully");
}
@Override
public void onFailure(Call<ImageResponse> call, Throwable t) {
Log.d(TAG, t.toString());
}
});
}
2. @Field
- @Field 는 form-urlencoded 로 보낼때 사용하므로 @FormUrlEncoded 와 함께 써야한다.
- form-urlencoded 는 key, value 형태로 전달할때 사용함
@FormUrlEncoded
@POST("products")
Call<ProductResponse> postProduct(@Field("key") String key,
@Field("product_id") int product_id,
@Field("option_id") int option_id);
apiService.postProduct(key, product_id, option_id).enqueue(new Callback<ProductResponse>() {
@Override
public void onResponse(Call<ProductResponse> call, Response<ProductResponse> response) {
Log.d(TAG, "RELATION POST SUCCESS");
}
@Override
public void onFailure(Call<ProductResponse> call, Throwable t) {
Log.d(TAG, t.toString());
}
});
3. @Body
- JsonObject 를 통째로 직렬화해서 보낼때 사용한다.
@POST("cart/save")
Call<CartResponse> postCart(@Body JsonObject jsonObject);
private void postCart() {
//Room data
CartRepository cartRepository = new CartRepository(getContext());
List<Cart> cartList = cartRepository.getListCart();
//현재 시간
long now = System.currentTimeMillis();
Date date = new Date(now);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
String formatDate = sdf.format(date);
JsonObject mainObj = new JsonObject();
JsonArray cartObj = new JsonArray();
JsonObject cartSubObj = new JsonObject();
cartSubObj.addProperty("order_time", formatDate);
cartSubObj.addProperty("key", "key");
JsonArray products = new JsonArray();
for (int i = 0; i < cartList.size(); i++) {
JsonObject proObj = new JsonObject();
proObj.addProperty("product_id", cartList.get(i).getItem_id());
proObj.addProperty("price", cartList.get(i).getItem_price());
proObj.addProperty("number", cartList.get(i).getItem_number());
products.add(proObj);
}
cartSubObj.add("products", products);
cartObj.add(cartSubObj);
mainObj.add("cart_list", cartObj);
apiService.postCart(mainObj).enqueue(new Callback<CartResponse>() {
@Override
public void onResponse(Call<CartResponse> call, Response<CartResponse> response) {
Log.d(TAG, "성공");
}
@Override
public void onFailure(Call<CartResponse> call, Throwable t) {
Log.d(TAG, t.toString());
}
});
}
- mainObj 확인
{
"cart_list": [
{
"order_time": "20201125-182820",
"vendor_key": "key",
"products": [
{
"product_id": 2,
"price": 5800,
"number": 5
},
{
"product_id": 12,
"price": 4500,
"number": 1
},
{
"product_id": 36,
"price": 7800,
"number": 2
}
]
}
]
}
반응형
'Android' 카테고리의 다른 글
RxJava (Subject, PublishSubject, BehaviorSubject) (0) | 2020.12.02 |
---|---|
[Android] Jetpack Room 사용법(1) (LiveData 사용 안 할 때) (0) | 2020.12.02 |
[Android] 이미지 슬라이드 + Retrofit2 (AdapterViewFlipper) (0) | 2020.11.25 |
Collection Framework (0) | 2020.11.25 |
[Android] Broadcast Receiver 를 이용한 App 자동 실행(전원이 켜질때) (0) | 2020.10.19 |
댓글