【PHP】2chat開発スレ【2chを越える】 [無断転載禁止]©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2016/04/23(土) 13:45:28.79ID:???掲示板とチャットを組み合わせたオープンソースのPHPスクリプトです。
名前の由来は2ch+chat
【特徴】
*基本的な面
ユーザー登録は必要だが、匿名
ユーザーは日付の経過や書き込み、荒らしなどでレベルが上下し、このレベルは通報の影響度などに関わる
管理人が不在でも通報が集まった書き込みは自動削除
チャット形式の為、書き込み上限はなく、テンプレはいつでも誰でも編集可能
板はなく、各スレッドはカテゴリを付けられる為、スレッドを探しやすい
単発スレには向かない
*専ブラ
jsを使い専ブラなしで快適に閲覧出来るUIを提供
WEBで見れるため、PC⇔スマホで開いているスレなどを完全同期できる
*API
誰でも使えるAPIを提供(jsonp対応)
2ch互換のAPIも提供
ユーザーはサブパスワードを作る事で、悪意を持った外部サービス管理人によるアカウントの乗っ取りを防ぐ事が出来る
開いているスレなども外部サービス間で同期可能
05211
2016/09/16(金) 23:48:46.55ID:???POSTとGETは分かりますが、残りは対応面倒と聞きました
全部POSTに統一が一番シンプルでいいかと思ったので、POSTに統一しています
05221
2016/09/16(金) 23:49:26.23ID:???0523nobodyさん
2016/09/16(金) 23:56:47.02ID:???例えば、User自体は削除できないんだから、Userに対してDeleteメソッドは定義する必要はないし。
Scalaとか使う道具にはこだわるが、作りだす物にはこだわりがないのかね?
いきなり全部はできんけど。
つか、せめて、取得系はGETでいくべきだ。全部POSTとか、クソAPI呼ばわりされること間違いなし。
RESTful APIに別に無理してしなくてもいいが、
例えばQiitaのAPIはRESTful APIっぽいし。
https://qiita.com/api/v2/docs
http://wp.tech-style.info/archives/683
05241
2016/09/17(土) 00:03:42.90ID:???なるほど
何か難しそうだけどそういう風なのが普通なのか
あとエラーコードの返し方も考えた方がよさそう
全部jsonで返しているし
05251
2016/09/17(土) 00:04:24.59ID:???0526nobodyさん
2016/09/17(土) 00:05:38.71ID:???https://dev.twitter.com/rest/public
Twitterはそんな感じだけど。パラメータの渡し方は。
05271
2016/09/17(土) 00:06:00.49ID:???0528nobodyさん
2016/09/17(土) 00:06:47.04ID:???JSONで返すんだし統一性がないと俺ならブチ切れる。
0529nobodyさん
2016/09/17(土) 00:09:19.60ID:???更に詳しい情報やメッセージなどをレスポンスのJSONボディで返すのが
普通かな。大手サービスはだいだいこんな感じ。
05301
2016/09/17(土) 00:10:05.25ID:???エラーの詳細はJSONだろうけど、HTTPステータスがエラーでも200 OK返しているからどうなのかなと思って
例えば、「本文が長すぎます」みたいなのは200 OKでいいの?
0531nobodyさん
2016/09/17(土) 00:12:25.56ID:???渡して、RPC的なんだと思う。
05321
2016/09/17(土) 00:12:43.05ID:???大まかなエラー内容はHTTPステータスでいいのか
REST APIで調べたら「セッションなどの状態管理を行わない」って書いてあったけどトークンってこれに含まれる?
何か凄く難しい
05331
2016/09/17(土) 00:14:25.50ID:???twitter参考にしているからこっちがいいのだろうか
何か凄く難しい…
TwitterAPI生では触った事ないから内部でどうなっているか考えた事なかった
0534nobodyさん
2016/09/17(土) 00:16:42.85ID:???それはまずい、それはクライアラント側のエラーだから
ステータスコードは400のBad Requestで、
JSONの方に、本文が長すぎますみたいな感じで。
まぁ、はじめてなんからほどほどでいいけど。
https://tools.ietf.org/html/rfc7231
で、どんなステータスコードあるかサクっと見たほうがいい。
4xx系がクライアント側のエラー
5xx系がサーバー側。例えば、クライアント側のリクエストには問題ないが、
サーバー側で問題発生で処理できないとか。
0536nobodyさん
2016/09/17(土) 00:23:06.98ID:???これって認証がらみのトークンだっけ??
通常は、HTTPのリクエストヘッダにAuthorizationヘッダってあるから
https://tools.ietf.org/html/rfc7235#section-4.2
これで渡してもらうのがふつう。
0537nobodyさん
2016/09/17(土) 00:25:30.64ID:???これをどのサービスを使ってるんだけど。まぁ、さすがに今は覚えることありすぎて
やりすぎかな。
QiitaのAPIもTwitterもFacebookもDropboxもOAuth2だし。みんなこれ使ってる。
05381
2016/09/17(土) 00:28:52.08ID:???OAuthはTwitterで聞いた事はあるけどよく知らない
HTTPってかなり複雑だったんだな…
05391
2016/09/17(土) 00:31:04.56ID:???0540nobodyさん
2016/09/17(土) 00:34:41.55ID:???いろいろ大手のAPIを叩いたし、OAuth2のクライアント側も自分で実装したりしたから、
ここらへんは叩き込まれてるけど。あくまでクライアント側だけだから。
>>507で書いたように今はサーバ側を君と一緒に勉強しようとかなと
ここに居座ってるw
05411
2016/09/17(土) 00:36:51.23ID:???0542nobodyさん
2016/09/17(土) 00:42:23.14ID:43HWDKIQそこだね。見てて思ったんだけど、作り方が水平方向的?なんだよね。
例えば、モデルクラス作るなら、一気に全部モデルクラスを作るみたいな。
これだと、途中で設計まずったときに全部作り直しになるじゃん。
俺なら例えば最初にUserだけのモデル作って、その次は垂直方向にUser用のAPIを作るね。
そうすりゃ、早い段階で問題点に気づけるし、全体像を早い段階で気づける。
05431
2016/09/17(土) 10:10:06.72ID:???クラス間の依存とか考えたら結構難しくて…
0544nobodyさん
2016/09/17(土) 10:34:47.47ID:???05451
2016/09/17(土) 10:41:23.23ID:???ここ全く考えてなかった
05461
2016/09/17(土) 10:55:39.20ID:???・Tokenの仕様変更
・Storageは1トークン1つ
・GET、POSTメソッドを分ける
・HTTPステータスも返す
0547nobodyさん
2016/09/17(土) 14:47:49.39ID:???HTTPSを使わんと。
Let's encrypt!!
05481
2016/09/17(土) 16:02:12.48ID:???サーブレット側でも対応することあるの?
0549nobodyさん
2016/09/17(土) 17:05:10.60ID:???というよりそういう事いいたかったんじゃなくて、HTTPSはサーバー証明書が
必要になるわけだから、サーバー証明書簡単に取れるのか知らないので
そこらへん気をとめておいてねって言いたかった。
05501
2016/09/17(土) 17:13:27.05ID:???05511
2016/09/17(土) 17:16:17.06ID:???http://qiita.com/uasi/items/cfb60588daa18c2ec6f5
05521
2016/09/17(土) 17:29:25.24ID:???とりあえずはリクエストパラメーターでいいか…
0553nobodyさん
2016/09/17(土) 17:38:38.30ID:???で、独自認証なんでしょ??そんだったら、
Authorizationヘッダのフォーマットを自由に決めていいんだって
(HTTPのAuthorizaitionヘッダの形式に違反しないかぎり)。
例えば、Authorization : nch {token}
とか
0554nobodyさん
2016/09/17(土) 17:42:20.58ID:???Authorization: auth-scheme (token68 / auth-params)
ってなってんじゃん。この形式にしたがってフォーマット決めておけばOK。
例えばauth-schemeは「nch」ね(IANAにもちろん登録されてないスキームだけど)。
後はtoken68の形式か。
05551
2016/09/17(土) 17:45:18.34ID:???Authorization : nch (token_id) (token_key)みたいな感じで
0556nobodyさん
2016/09/17(土) 17:46:14.52ID:???Chatwork API は X-ChatWorkToken: トークン ヘッダ
ってなってるように、独自のリクエストヘッダを定義するとか。
X-NChTokenみたいな。
0557nobodyさん
2016/09/17(土) 17:48:34.18ID:???そう。Authorization: BearerとかはOAuth2を使ってるときの仕様であって、
OAuth2使ってないんだから、独自でもOKだと。HTTPの仕様に従ってるかぎり。
0558nobodyさん
2016/09/17(土) 17:51:12.40ID:???厳密にはこうだから、パラメータ2つ渡したいなら
Authorization : nch id=(token_id), key=(token_key)
こんな感じかな。確か,区切りでいいはず。
05591
2016/09/17(土) 17:56:31.37ID:???=の前後とか
解析難しそう
0560nobodyさん
2016/09/17(土) 17:56:43.62ID:???ステータスコード401のUnauthorizedでレスポンス返す。
で、レスポンスのヘッダにWWW-Authenticate : nch
って指定して、nchスキームでの認証が必要ですよって示すのが普通。
0561nobodyさん
2016/09/17(土) 18:00:31.58ID:???auth-param = token BWS "=" BWS ( token / quoted-string )
BWS=Bad White Spaceで仕様上は許可してるけど、推奨しないホワイトスペースだね。
0562nobodyさん
2016/09/17(土) 18:04:29.65ID:???まず、ヘッダ全体をスペースでSplitする(.NETならString.Split)で、
先頭がauth-scheme。で、今度は残り全体をまず「,」でSplitする。
でそれを今度は「=」でSplitして、終わり。
適宜前後のホワイトスペースをTrimする。
0563nobodyさん
2016/09/17(土) 18:11:07.36ID:nfgV7g+hvar items = authHeader.Split(' ', 1, StringSplitOptions.RemoveEmptyEntries);
items[0]がauth-schemeで空白は既にない。
items[1]が残り。
items[2].Split(',').Select(i => i.Trim());
でこれをそれぞれSplit('=').Select(i => i.Trim())
で終わり。
HTTPの仕様上、quoted-stringってのがゴミ。これを含めると解析はクソめんどくさくなる。
0564nobodyさん
2016/09/17(土) 18:14:24.42ID:???は
items[1].Split(',').Select(i => i.Trim());
こうだった。
だから、君の仕様でquoted-stringを使わないように認証トークン生成して
仕様で決めてくれれば解析は楽。
05651
2016/09/17(土) 18:15:14.69ID:???省略可能なパラメーターがある訳ではないし(id),(key)の方が楽だと思う
仕様でそうなっているから?
0566nobodyさん
2016/09/17(土) 18:16:16.49ID:???Nch-ID : token_id
Nch-KEY : token_key
と独自ヘッダで分けてくれれば一番楽だね。
05671
2016/09/17(土) 18:17:28.80ID:???それならそうしようかな
0568nobodyさん
2016/09/17(土) 18:17:57.62ID:???そうだね。仕様でそうなってるからだね。
俺だったら仕様違反はしないけど、もし、(id),(key)にしたいなら、
独自ヘッダにするね。
0569nobodyさん
2016/09/17(土) 18:19:56.47ID:???うん。独自ヘッダは最初にX-ZZZZみたいなX-を先頭につける慣習??みたいの
あるっぽいことだけ指摘しておく。
05711
2016/09/17(土) 18:26:51.23ID:???0572nobodyさん
2016/09/17(土) 18:28:16.24ID:???仕様で確認してね。
0574nobodyさん
2016/09/17(土) 20:53:57.80ID:???05751
2016/09/17(土) 21:08:17.79ID:???05761
2016/09/17(土) 21:22:09.76ID:???これは分ける必要なさそう
0577nobodyさん
2016/09/17(土) 21:22:16.27ID:???どっちかしない。開発者にとっては、完成させれなくても勉強になるけど。
だから、進んでても最終的に完成するかしないかが問題。
0578nobodyさん
2016/09/17(土) 21:30:42.88ID:???05801
2016/09/17(土) 21:36:54.23ID:???200 成功
401 認証が必要/認証エラー
403 リクエストの送りすぎ(書き込み間隔が短い)
404 見つからない(スレなど)
409 既に存在する(スクリーンネームなど)
421 リクエストがおかしい(パラメータが足りない、数値に変換出来ない、文字列が正規表現に一致しない、長すぎる)
500 鯖内部でエラー
05811
2016/09/17(土) 21:39:51.01ID:???トピック検索APIで見つからなかったら成功+空の配列を返している
つまり単取得系と多取得系の違い
これってどっちもエラー返すべきだろうか…
0582nobodyさん
2016/09/17(土) 21:49:02.01ID:???昨日も書いたけど、すごい水平展開に開発していくな。
https://tools.ietf.org/html/rfc7231
には421のってないな。
まぁ、そんな感じでいいんじゃないかな。
細かいところはAPIによってもマチマチだし。
05841
2016/09/17(土) 21:51:08.71ID:???421 Misdirected Request (RFC 7540)
誤ったリクエスト。
05851
2016/09/17(土) 21:52:45.98ID:???05861
2016/09/17(土) 21:54:03.23ID:???詳細教えたら危険だろうし
0587nobodyさん
2016/09/17(土) 22:00:42.38ID:???でないと、また、大幅な手戻り発生しそう。
クラスの依存関係で無理って言ったけど、そんなの当たり前。
だから、そこらへんは適当に動くようにつくればいいだけ。後で修正すればいいんだから。
>>544の人もアドバイスしてくれてるのに。
05881
2016/09/17(土) 22:02:21.52ID:???なら適当にAPI作って動かしてみる
0589nobodyさん
2016/09/17(土) 22:10:38.89ID:???君みたいなやり方してないぞww
初めての作業で全体像見えないまま、クラス設計なんてしようがないし。
だから、とりあえず、1,2つだけモデルクラスを作って、それで次はすぐにWeb APIの方作って、
実際にブラウザからアクセスさせてる。
それで、作り方に問題なさそうって確認してから、おおざっぱに全体の設計を
把握してから残りモデルクラスの作業に取り掛かってる。
0590nobodyさん
2016/09/17(土) 22:24:28.58ID:???ぼくのかんがえたさいこうの設計目指さなければ
0591nobodyさん
2016/09/17(土) 22:27:06.02ID:???0592nobodyさん
2016/09/17(土) 22:29:55.08ID:???5,6ぐらいしかないし。
0593nobodyさん
2016/09/17(土) 22:33:27.35ID:???タイプミスとかでエラー、メソッド名もまだ覚えてないから補完したいのにで
出なくていちいちブラウザで調べたりしてブチキレで。ASP.NET Coreの方に移行中だけど。
05941
2016/09/17(土) 22:36:38.04ID:???もしかしてここって職業プログラマ多い?
0595nobodyさん
2016/09/17(土) 22:44:10.09ID:nfgV7g+hかかるんだからしょうがないよ。
でも、なれればテーブル数も5,6ぐらいで小機能だし、5日ぐらいで実装できると思う。
俺はまだサーバーサイドは素人だから慣れが必要だけど。
でも、クライアントサイドやってきた経験から言うと、慣れれば機能的には5日くらいあれば実装できるとは思ってた。
サービスの仕様とか考える時間とかは別問題だから抜かしてね。
単純に実装する時間だけの話ね。
0596nobodyさん
2016/09/17(土) 22:44:38.69ID:???05971
2016/09/17(土) 22:50:52.40ID:???俺の中では今まで作ったWEBアプリで一番大きいのに…
05981
2016/09/17(土) 23:02:38.97ID:???0599nobodyさん
2016/09/17(土) 23:02:41.15ID:???業務だとテーブルだけでも何十、何百って数あるんだから。
で、それらのテーブルを複数結合したり、バッチで何十のテーブルを見て更新かけたり。
だからテーブル数5,6って学生の宿題用(テーブル数2,3?)に毛が生えたぐらいの規模だと。
2chだってもともと小機能なんだし。ただ、小機能とはいえユーザー数は
圧倒的だから。そこらへんはまた単純に作るだけじゃなく別のノウハウが必要だと思う。
06001
2016/09/17(土) 23:07:40.52ID:???テーブルが何百って…そんなにあるのか
2chは単純だからな。ユーザーが多い以外に良い所がない気もするけど、掲示板だとユーザーの数が最大のメリットになるし
専門学校とか大学の工業科ってこういうの作ったりするの?こういう系の仕事するなら工業科進んだ方がいいかな
06011
2016/09/17(土) 23:09:46.74ID:???gzipの存在知らなくて転送量で死に掛けた時期があったらしいし、技術と言うより単純な仕組みだから負荷少ないのだろうか
06021
2016/09/17(土) 23:12:09.04ID:???csv→xmlの簡単な変換器作った方が早そう
0603nobodyさん
2016/09/17(土) 23:22:30.64ID:???/api/v1/ここどうするの?
06051
2016/09/17(土) 23:26:23.63ID:???/api/http/topic/write/
みたいな
0606nobodyさん
2016/09/17(土) 23:30:10.83ID:???必要な情報は全部、クエリ文字列で渡すんでしょ?
0608nobodyさん
2016/09/17(土) 23:47:54.31ID:???RPC的なTwitter APIぽくしてるってことね。
了解。
06091
2016/09/17(土) 23:51:34.62ID:???直接触った事はなくても、4j使って触った事はあるから他のに比べたら分かるし
06101
2016/09/18(日) 00:00:21.08ID:???オープンオフィスでAPIリスト作れば自動で変換してくれる
06111
2016/09/18(日) 00:26:10.28ID:???0612nobodyさん
2016/09/18(日) 11:59:41.41ID:???まあAppServer無くてもjarは動かせるが
06131
2016/09/18(日) 12:12:33.89ID:???別にクラスパス間違っている訳じゃないし
0614nobodyさん
2016/09/18(日) 13:20:47.67ID:???まあ色々ややこしいとこはあるかなあ
06151
2016/09/18(日) 13:24:53.37ID:???java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Nch]]
エクリプスから実行したら
情報: サービス Catalina を起動します [日 9 18 13:23:35 JST 2016]
情報: Starting Servlet Engine: Apache Tomcat/8.0.32 [日 9 18 13:23:35 JST 2016]
情報: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [185] milliseconds. [日 9 18 13:23:36 JST 2016]
重大: A child container failed during start [日 9 18 13:23:37 JST 2016]
重大: A child container failed during start [日 9 18 13:23:37 JST 2016]
重大: The required Server component failed to start so Tomcat is unable to start. [日 9 18 13:23:37 JST 2016]
情報: Pausing ProtocolHandler ["http-apr-8080"] [日 9 18 13:23:37 JST 2016]
情報: Pausing ProtocolHandler ["ajp-apr-8009"] [日 9 18 13:23:37 JST 2016]
情報: サービス Catalina を停止します [日 9 18 13:23:37 JST 2016]
情報: Destroying ProtocolHandler ["http-apr-8080"] [日 9 18 13:23:37 JST 2016]
情報: Destroying ProtocolHandler ["ajp-apr-8009"] [日 9 18 13:23:37 JST 2016]
0616nobodyさん
2016/09/18(日) 15:15:31.08ID:???それからじゃな。
0617nobodyさん
2016/09/18(日) 15:18:58.45ID:???06181
2016/09/18(日) 15:24:07.23ID:???0619nobodyさん
2016/09/18(日) 15:32:43.63ID:???サーブレットって引数なしのコンストラクタ以外のコンストラクタって
定義できる??。俺はそれが気になるわ。>>514に書いたけど。
06201
2016/09/18(日) 15:36:34.74ID:???HttpApiBaseは親クラスだから関係ないと思ってたんだけど違う?
web.xmlに書いているクラスは全て引数無しのコンストラクタ
■ このスレッドは過去ログ倉庫に格納されています