はじめに
読んだ書籍をリスト管理するアプリを作成するべく、書籍追加の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にしてたの?って感じなんでしょうね。笑
完全な知識不足です。勉強になりました〜。