LoginSignup
1
0

More than 3 years have passed since last update.

POSTパラメータで安易に@Query使ったら泥沼にハマった

Last updated at Posted at 2020-11-15

はじめに

読んだ書籍をリスト管理するアプリを作成するべく、書籍追加のAPI実装をしておりましたが
どんな画像を選択しても画像取得エラーとなり追加できませんでした。
ようやく泥沼から抜け出せたので備忘録として記録しておきます。
追加

原因

Log
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にしてたの?って感じなんでしょうね。笑 
完全な知識不足です。勉強になりました〜。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0