JSON API を使用してユーザーをグループに追加しているのですが、ターミナルから実行すると期待通りに動作する一方、Java から curl を呼び出すと {"status":400,"error":"Bad Request"} というエラーが返ってきます。
そこでログを確認したところ、以下のような内容が記録されていました:
![]()
何が間違っているかご存知の方がいらっしゃいますか?
JSON API を使用してユーザーをグループに追加しているのですが、ターミナルから実行すると期待通りに動作する一方、Java から curl を呼び出すと {"status":400,"error":"Bad Request"} というエラーが返ってきます。
そこでログを確認したところ、以下のような内容が記録されていました:
![]()
何が間違っているかご存知の方がいらっしゃいますか?
こんにちは、
おそらく、curl への引数(Java からシェルを呼び出していると推測します)が正しく転送されていないのでしょう。これは通常、クォーテーションの誤りに起因します。
該当する Java コードを共有していただければ、何が問題なのかを推測できるかもしれません。
よろしくお願いいたします、
Andreas
もちろん!今のところ私が持っているコードは以下の通りです:
command = "curl -X PUT https://discourse.domain.tld/groups/" + roleID + "/members.json \\\n" +
" -d '{\"usernames\" : \"" + user.get("username") + "\"}'\\n" +
" -H \"Content-Type: application/json\"\n" +
" -H \"Accept: application/json\"\n" +
" -H \"Api-Key: redacted\"\\n" +
" -H \"Api-Username: Bot\"";
Process nitroProcess = Runtime.getRuntime().exec(command);
String outputString = new BufferedReader(
new InputStreamReader(nitroProcess.getInputStream(), "UTF-8"))
.lines()
.collect(Collectors.joining("\n"));
System.out.println("Output String: " + outputString);
roleID には整数を渡しており、user.get("username") は JSON リクエストから取得した文字列です。
必要であればさらに情報を共有することもできますが、機密情報が漏れないよう注意しています。
System.out.println(command)を実行し、必要に応じて変数roleIDおよびuser.get("username")の内容を伏字にした上で、その出力結果を共有していただけますでしょうか。
よろしくお願いいたします。
Andreas
\' のクォートが正しいかどうか確信が持てません。これはどうでしょうか?
-d '{"usernames": "" + user.get("username") + ""}'\\n"
つまり、私の CURL コマンドは以下のようになります:
curl -X PUT https://discourse.domain.tld/groups/50/members.json \
-d '{"usernames" : "Torbjörn"}' \
-H "Content-Type: application/json"
-H "Accept: application/json"
-H "Api-Key: [redacted]" \
-H "Api-Username: Bot"
クォーテーションについては、こちらのドキュメントに従いました here。
このコマンドを WSL のターミナルに貼り付けると、意図通り実行され、正常に動作します。
ありがとうございます。いくつかの行が \\ で終わっており、そうでないものもある点に注意を向けたいです。また、ウムラウトが原因である可能性はありますか?ウムラウトを含まないユーザー名でもテストしていただけますか?
いくつかの行から \ を削除しましたが、その結果異なるエラーが発生しました。特殊文字を含まないユーザー名の場合でも、同じ問題が発生します。
curl -X PUT https://discourse.domain.tld/groups/50/members.json \
-d '{"usernames" : "Av3r4ge"}' \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Api-Key: [redacted]" \
-H "Api-Username: Bot"
出力文字列: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}
ここで思いつきがありません。
おそらく、JSON ペイロードのキーの後のスペースを削除すれば、まだ有効な JSON として機能するかもしれません。例えば、以下のようにします:
{"usernames":"Av3r4ge"}
はい、同じ問題です。この時点で、リクエストを行うためのライブラリを使うことを検討するつもりです。なぜこんなに難しいのか、まったくわかりません。トラブルシューティングのサポート、ありがとうございます。