POST 매개 변수로 안이하게 @Query를 사용하면 진흙 늪에 빠졌습니다.

소개



읽은 책을 목록 관리하는 앱을 만들 수 있도록 책 추가 API 구현을했습니다.
어떤 이미지를 선택하더라도 이미지 획득 오류가 발생하여 추가할 수 없습니다.
드디어 진흙 늪에서 빠져 나올 수 있었으므로 비망록으로 기록해 둡니다.


원인



로그
Response{protocol=http/1.1, code=414, message=Request-URI Too Large

분명히 URI가 너무 길다. 하지만 왜 그렇게 길어지는 거야?
원인은 요청으로 데이터를 보내는 방법에 문제가 있었다.

ApiInterface.java
public interface ApiInterface {
    @Headers(HEADERS)
    @POST("/books")
    Call<BookInfoResponse> addBook(
            @Header("Authorization") String token,
            // ↓原因 
            @Query("name") String bookTitle,
            @Query("image") String stringImage,
            @Query("price") int bookPrice,
            @Query("purchase_date") String purchaseDate
    );

@Query란?



데이터베이스로 보낼 쿼리 문을 지정하는 방법. URL에 정보가 기재된다.

즉 책명이나 이미지 패스나 추가하는 북의 정보 모두가 URL에 포함하는 설정으로 한 것입니다.
그건 길어질거야.
원칙적으로
· Post 요청은 @Body
・GET 리퀘스트는 @Query (※GET 리퀘스트로 @Body 는 사용할 수 없다)
라는 것.

라는 것으로 @Body 로 변경하면 잘 되었습니다! 

ApiInterface.java
public interface ApiInterface {
    @Headers(HEADERS)
    @POST("/books")
    Call<BookInfoResponse> addBook(
            @Header("Authorization") String token,
            // @Bodyに変更
            @Body BookRequest bookRequest
    );

BookRequest.java
public class BookRequest {
    @SerializedName("name")
    private String title;

    @SerializedName("price")
    private int price;

    @SerializedName("purchase_date")
    private String purchaseDate;

    @SerializedName("image")
    private String image;

    public BookRequest(String title, int price, String purchaseDate, String image) {
        this.title = title;
        this.price = price;
        this.purchaseDate = purchaseDate;
        this.image = image;
    }
}

공부한 사이트



마지막으로



여러분으로부터 하면, 원래 어째서 @Query 로 하고 있었어? 라는 느낌이겠지요. 웃음
완전한 지식 부족입니다. 공부가 되었습니다~.

좋은 웹페이지 즐겨찾기