SE(しがないエンジニア)のブログ

IT技術ネタ(クラウド・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

Redmine REST API にて textarea の改行問題を解決する

先日上げた記事のつづきで・・・・。

Redmine REST API を利用した際に issue を create する記事を上げたのですが、1点上手くいかないところがありました。それが「textarea フィールドに入力された値を description で post する」という点です。何が上手くいかないかと言いますと、「改行なし」の場合はすんなり行くのですが「改行あり」だと上手く行かないといった感じです。

もし、成功すると結果的には create された issue の「説明」部分に反映されます。自社での活用事例としては Q & A システムを Web アプリの一機能として搭載して Q 発行毎に issue を create するといった事例で利用していました。下記はイメージです。(Q に飛ぶ URL と textarea の内容)
f:id:btsn:20200814005235p:plain
参考ですが前回にあげている記事はこちらです。
Redmine(+ Digest 認証環境下)で curl コマンドを利用し issue create を行う - SE(しがないエンジニア)のブログ

どう解決した?

自社の場合は Web アプリを php で開発しているのですが replace 関数でデバッグしながら辿り着いた結果が下記です。(「$post_dataArray['hoge']」に textarea の内容が入っていると思って下さいませ)

<?php
$temp_hoge = str_replace(array("\r\n", "\r", "\n"), 'hogehoge', $post_dataArray['hoge']);
$temp_hoge_rc = str_replace('hogehoge', "\\r\\n", $temp_hoge);

exec("curl --insecure --anyauth --user (username):(password) --location-trusted -X POST -H \"Content-Type: application/json\" -d '{\"issue\":{\"project_id\": \"".$project_id."\", \"subject\": \"".$post_dataArray['title']."\", \"tracker_id\": (tracker_id), \"status_id\": (status_id), \"description\": \"".$url."\\r\\n\\r\\n".$temp_hoge_rc."\", \"watcher_user_ids\": ["user_id"(, "user_id") ... ]}}' (redmine_url)/issues.json", $op);
?>

前回のサンプルは CUI 上から curl コマンドを直接実行したものでしたが、今回は php サンプルとして掲載します。

簡単な解説としては
=====
・1行目の置換で textarea の内容(改行付き)を置換(ブラウザ間の解釈を吸収)
・2行目の置換で「\\r\\n」に置換して REST API で正常に実行できるよう置換
・exec 部分は前回記事との内容は大差なしで。変数との繋ぎ込みの参考として。
=====
といった感じです。

これも、中々サンプルらしいサンプルがなかったので誰かのお役に立てましたら・・・・。