ラベル HTTP の投稿を表示しています。 すべての投稿を表示
ラベル HTTP の投稿を表示しています。 すべての投稿を表示

2018年10月7日日曜日

ASP.NET Core Web API - GET と POST

ASP.NET Core Web API で GET メソッドと POST メソッドの実装方法を調べてみました。


ValuesController.cs (一部抜粋)
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody] string id)
    {
    }
}

index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <input type="button" value="click" onclick="get()" />
    <input type="button" value="post" onclick="post()" />
    <script>
        function get(){
            var httpRequest = new XMLHttpRequest();
            httpRequest.onreadystatechange = function () {
                if (httpRequest.readyState === 4) {
                    if (httpRequest.status === 200) {
                        console.log("GET: 通信成功");
                    } else {
                        console.log("GET: 通信失敗");
                    }
                }
            };
            httpRequest.onload = function () {
                console.log("GET: 通信完了");
            };
            httpRequest.open("GET", "api/values", true);
            httpRequest.send(null);
        }

        function post() {
            var httpRequest = new XMLHttpRequest();
            httpRequest.onreadystatechange = function () {
                if (httpRequest.readyState === 4) {
                    if (httpRequest.status === 200) {
                        console.log("POST: 通信成功");
                    } else {
                        console.log("POST: 通信失敗");
                    }
                }
            };
            httpRequest.onload = function () {
                console.log("POST: 通信完了");
            };
            
            httpRequest.open("POST", "api/values", true);
            httpRequest.setRequestHeader('Content-Type', 'application/json');
            httpRequest.send(JSON.stringify("id=abc"));
        }
    </script>
</body>
</html>

POST を行うときには、setRequestHeader で Content-Type に application/json を指定する必要があります。ここが分からなくてしばらく調べました。

2018年3月27日火曜日

ASP.NET Web API で JSON を返す方法

ASP.NET Web API で JSON を返す実装例です。

1.WebApiConfig クラス内で "text/html" フォーマットをリターンするようにします。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API の設定およびサービス
        ...

        //json を返す
        //https://stackoverflow.com/a/13277616
        config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new MediaTypeHeaderValue("text/html"));
    }
}

2.Request.CreateReponse メソッドに、ステータスコードと、モデルのリストを渡します。すると、クライアントには JSON がリターンされます。

public class ProductsController : ApiController
{
    ...

    public HttpResponseMessage Get()
    {
        IList<IProduct> products = _rep.GetAll();

        //モデルリストから JSON に変換
        //Content Negotiation in ASP.NET Web API
        //https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/content-negotiation#serialization
        return Request.CreateResponse(HttpStatusCode.OK, products);
    }
}

2017年5月3日水曜日

HTTP 認証(ベーシック認証とダイジェスト認証)

HTTP 認証について

セキュリティで保護されているリソースへアクセスする際に、クライアントがリソースにアクセスする権限を持っているかを確かめる行為です。ID とパスワードの組み合わせで認証を行います。主にベーシック認証とダイジェスト認証が利用されています。

ベーシック認証

ベーシック認証では、ID と パスワードが Base64 エンコードされた文字列で送られます。Base 64 でのエンコード文字列はデコードが可能なため、セキュリティの観点では平文によるデータ送信と同義です。パスワードを安全に送信するためには、別途 HTTPS によるデータの暗号化が必要です。

ダイジェスト認証

ダイジェスト認証では、ベーシック認証とは異なりパスワードが MD5 によりハッシュ化された状態で送信される。ベーシック認証と比較するとよりセキュアな通信となります。ただし、パスワードを暗号化するのみであり、クライアントから送信されるメッセージそのものはベーシック認証と同様に平文で送られます。メッセージの暗号化にはベーシック認証と同じく HTTPS が必要です。


参考:
Basic認証
https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC

Digest認証
https://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC

リンク:
情報工学・情報処理技術
http://kainobi2.blogspot.jp/p/blog-page_13.html
http://kainobi2.blogspot.jp/p/blog-page_13.html

HTTP メソッド一覧

HTTP/1.1 では下記 8 つのメソッドを定義しています。

メソッド意味
GETターゲットとなるリソースを取得。
HEADターゲットとなるリソースのヘッダを取得。
(GET メソッドで取得されるヘッダ情報と同じ。)
POSTPOST には下記、複数の機能がある

・入力項目などフォームデータの送信。
・新規にリソースを生成。
・既存リソースへのデータ追加。
・ブログやメーリングリストなどへのメッセージの送信。
PUTリクエスト内で指定されたリソースの生成もしくは更新。
DELETEリクエスト内で指定されたリソースの削除。削除が成功すれば、サーバーからのレスポンスはステータスコード  204(No Content)、もしくは 200(OK)のリターンが推奨。
CONNECTプロキシサーバーを経由したトンネル接続。例えば、SSL による通信を行う際に、プロキシサーバーがクライアントと対象サーバー間のコミュニケーションを中継。
OPTIONSターゲットとなるリソースが提供しているメソッドの取得。
TRACEリクエストをそのままレスポンスとしてリターン。



参考:
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content

HTTP request methods

2017年5月2日火曜日

HTTP ステータスコードの分類

HTTP ステータスコードの分類です。

ステータスコード意味
1xx処理は継続中である状態。サーバーからの一時的(暫定的)なレスポンス。
2xxクライアントのリクエストを、サーバーが受信に成功した状態。
3xxリクエストしたリソースは他の位置にある状態。リダイレクトを実施してリソースにアクセスする。
4xxクライアントが送るリクエストの内容に誤りがある状態。
5xxサーバーに何らかの問題がある状態。リクエストを処理する機能が無い場合や、メンテナンス等によりリクエストに対応できないなど。

基本的にはステータスコードの先頭1桁と、その意味を把握しておき、詳細は別途調べるというスタイルで大丈夫かと思います。

参考:
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
https://tools.ietf.org/html/rfc7231

リンク:
情報工学・情報処理技術
http://kainobi2.blogspot.jp/p/blog-page_13.html