配列、リスト形式のデータをPOSTする際のjava、curl、Ajaxでの操作

この記事はKobe University Advent Calendar 2017の15日目の記事です。なお筆者は当該大学の大学院1回生(2017年現在)です。

背景

授業の関係で、筆者はCloud Spiralというコースを参加させてもらいました。主に最近話題のクラウドサービースについて勉強するのですが、webアプリ開発の知識をいっぱい勉強できました。大学院のほかのどの授業よりも勉強になりました。

最終課題ではチーム開発に入りまして、バックエンド側のとあるAPI部分を担当させてもらいました。その時になかなか解決できない問題及び解決方法について紹介できたらと思います。

問題

API実装に当たって、リストデータの取り扱いがなかなか難しいでした。この記事では、

  1. javaAPI作成する際にリストを受け取るような関数の設定し方。
  2. curlでテスト動作を確認する際リストの渡し方。
  3. Ajaxでリストデータを送信する時の仕方。

についてメモろうかと思います。

javaAPI作成する際にリストを受け取る方法

配列が欲しいので、Listで操作ができます。書き方がこんな感じです:

public Response postRequest(@FormParam("ID") List<Integer> id) {

}

その後は普通のリスト関連の操作と変わらない操作ができます。

後余談ですがパラメータの取り方:Get HTTP header in JAX-RS

 curlでリストをPOST

筆者がハマったのがここです。curlについては理解してるとは言えませんので、説明を省きます。ターミナルで 

man curl

を打ったらマニュアルが表示します。

  1. curlについて: curl - How To Use
  2. 日本語版:  http://archive.fo/ZjQfk

ここら辺のマニュアルを読んだんですが、list関連の説明がどれも書いておりません。筆者もかなり悩みました。最後色々適当にコマンドを叩いた結果、一応上のjavaコードに対応するcurlのPOSTコマンドは:

curl http://hogehoge/request -X POST -d id=1 -d id=2

なるほど、リストの要素数だけデータとして渡せばいいのですね。

(追記:このcurlコマンドは、上記のjavaAPIに対応します。プログラム上、idはList<Integer> になります。)

Ajaxでリストのデータを送信する

開発の段階では自分に全く関係ないのですが、一応チーム開発なので、フロント側がajaxを用いてリストデータを送信する際にどうしてもリストとして認識してくれません。これに関しては先行記事がすでに存在してあります:

jQuery.ajaxで配列を送信するのに嵌った - けさらんぱさらん

一応ここでも書いておきます。

$(function () {
    $.ajax({
        url: "hogehoge/request",
        type: "POST",
        datatype: "json",
        id: { values: [1, 2] },
traditional: true, }); });

もっとも大事なのは、一番最後の

        traditional: true,

になります。

(追記: 最後の一行traditional:trueを書かないと、渡されたidの要素は一つのみになってしまう。)

後書き

キーワード:java リスト list 配列 curl ajax

 

筆者がリスト関連の、特にcurlの部分が丸一日探し回って見つかりませんでした(検索方法が悪かったのかな?)。自分と同じようなことをする人が、キーワードによってこの記事にヒットして何かが得られたら幸いです。

 

開発においでは自分がとてつもなく情弱です。いいチームに恵まれていい経験が積まれました。本当にありがとうございます。

チームメイト一覧(あだ名、五十音順):

フロントエンド班: イリエッティー、くれない(リーダ)、ザキヤマ

バックエンド班: 村長(リーダ)、パンちゃん

 

追記(2018/08/24):

もちろん、プログラムを作成する時は設計書通りに書かなくてはいけないと思います。今回は:

  • javaプログラム内List<integer>
  • curlcurl [url] -d [dataName]=[datavalue1] -d [dataName]=[datavalue2]

ソースコードのおよびテストを設計したため、上記のように問題を処理しました。

 

そのほか、設計書段階からpostデータを直接jsonデータとして設計した場合、プログラムに渡す方法もあります。

例としてはこちらの記事をご覧ください:

Javaで文字列をJSONObjectに変換する方法 arrays | CODE Q&A [日本語]

 

 

 

ご指摘、ご意見などがあれば、ツイッターにでご連絡いただければ修正します。

UK. (@ukohank517) | Twitter