SlideShare a Scribd company logo
Web API 通信の符号化について
ASN.1, JSON, MessagePack, …
Bitz 村上 幸雄
開発環境:MacBook Pro (Retina, 13-inch, Late 2013) macOS 10.13.6 Xcode 9.4.1
発表日:2018/09/12







■はじめに
本発表では、Web API 通信の基本と符号化について説明する。
■HTTP通信
Web API通信とは、Webブラウザでホームページを閲覧する際のHTTP通信と同じ物だ。サーバから
得られた結果を文書としてWebブラウザで表示するか、プログラムで利用する為のデータを取得するか
の違いでしかない。
Webブラウザのアドレス欄に、「http://www.bitz.co.jp/index.html」と入力すると、Webブラウザ
はサーバに対して以下の要求を送る。
すると、サーバは、以下の応答を返す。
GET /index.html HTTP/1.1
Host: www.bitz.co.jp
Accept: image/pict, image/postscript, */*
Accept-Language: en
Connection: Keep-Alive
Uset-Agent: ave-front/1.0
要求
Webブラウザは、応答のボディ部のデータを表示している。
Web API通信では、ボディ部に符号化されたデータが格納されることになる。
■ASN.1
通信のデータ構造、エンコード、デコードを記述する記法で、たとえば、SNMPで利用されている。RSA
公開鍵を生成する必要があって、ASN.1の知識が必要になったことがあったが、その際、調べた事を説明す
る。
RSA公開鍵は、modulusとpublicExponentの二つのパラメータで構成されている。他のプラットフォー
ムでは、この二つのパラメータからRSA公開鍵を生成するAPIが用意されていたのだが、iOSでは用意され
ていなかったので、独自に対応した。
RSA公開鍵のASN.1での定義は以下のとおり。
ASN.1のエンコード方式は複数あるのだが、RSA公開鍵はDERということなので、これについて説明す
る。
SEQUENCEやINTEGER等のオブジェクトの形式は以下のとおり。
タグの番号は以下のとおり。
タグ 長さ 値
HTTP/1.1 200 OK
Date: Sat, 25 Aug 2018 23:40:00 GMT
Server: Apache/1.3.9 (Unix)
Last-Modified: Fri, 24 Aug 2018 09:30:00 GMT
ETag: “12345-123-12345678”
Content-Length: 141
Content-Type: text/html
<html>
<head><title>INDEX</title></head>
<body>
本文
</body>
</html>
応答
ヘッダー部
ボディ部
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
RSA公開 のASN.1での定義
オブジェクトのタグ欄には、タグ番号がそのまま格納されるのではなくて以下の形式となっている。
7∼8bitのクラスは、汎用型のSEQUENCEとINTEGERのみなので、RSA公開鍵では00となる。
6bitの構造化は、INTEGERは単一型(0)、SEQUENCEは構造型(1)となる。なので、タグ欄にはINTEGER
にはタグ番号そのものが設定され、SEQUENCEは、00+1+10000=0x30となる。
長さ欄は、以下のとおり。
■JSON
JSONは、JavaScriptのオブジェクトの表記法をベースとした軽量なデータ記述書式で、人にとっての読
み書きしやすいのが特徴だ。
CocoaでJSONを扱うために以前からJSONSerializationというクラスが用意されていたが、その後追加
されたJSONEncoderとJSONDecoderを利用すれば、JSONの扱いもより一層簡単になる。
以下は、構造体からJSONデータを生成するサンプルだ。
タグ タグ番号 説明
INTEGER 0x02 整数型
SEQUENCE 0x10 構造体 / 配列
8 7 6 5 4 3 2 1
クラス
00: 汎用
構造化フ
ラグ
0: 単一型
1: 構造型
タグ番号
8 7 6 5 4 3 2 1
0 長さ(127オクテット以下)
8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1
1 長さ部の長さn トークン1 トークンn
…
{
"name" : "Pear",
"points" : 250,
"description" : "A ripe pear."
}
JSONの例
以下は、逆にJSONデータから構造体のインスタンスを得るサンプルだ。
■MessagePack
MessagePackはJSON感覚で利用できる符号化の仕組みで、公開されて仕様をもとに本家以外からも各
種環境のライブラリが提供されている。どの符号化方式を選ぶから、クライアント側の都合のみではダメで、
サーバ側の環境向けのライブラリが用意されているかが重要だ。この条件に合致するMessagePackはJSON
の次に採用される符号化の資格が十分あるが、我々Cocoaプログラマにとっての不満は、Objective-C /
Swift のライブラリが充実していないということだ。
なので、軽く触れる説明するにとどめる。
これをMessagePackで符号化すると以下のとおり。
struct GroceryProduct: Codable {
var name: String
var points: Int
var description: String?
}
let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe
pear.")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(pear)
print(String(data: data, encoding: .utf8)!)
構造体をJSONにエンコード
let json = """
{
"name": "Durian",
"points": 600,
"description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: json)
print(product.name) // Prints "Durian"
print(product)
JSONを構造体にデコード
{ “compact”:true, “schema@:0 }
JSON 27bytes
バイナリ書式なので、27bytesから18bytesに短縮。
■ProtocolBuffers
インタフェース定義言語(IDL)で構造を定義する符号化方式で、大規模なプロジェクトの場合、仕様書
からIDLを出力し、IDLで定義した内容でクライアントとサーバが通信するという利点がある。
Googleが開発したものだが、本家からObjective-C / Swiftのライブラリが提供されていないという欠
点があったのだが、なんと、Appleから提供されるようになった!
Swift Protobuf
例。定義ファイルを用意する。
Swiftコードを生成する。
これを利用してエンコード / デコードする。
[82][A7]compact [C3][A6]schema [00]
MessagePack 18bytes
syntax = "proto3";
message BookInfo {
int64 id = 1;
string title = 2;
string author = 3;
}
.proto ファイル
$ protoc --swift_out=. DataModel.proto
Swiftコードの生成
2-element map2-element map
7-byte string
true
7-byte string 6-byte string
true integer 0
■FlatBuffers
これもGoogle製の符号化方式で高パフォーマンスが特徴だ。
ただ、本家からObjective-C / Swiftライブラリが提供されていないので紹介するにとどめる。
■Apache Avro
これも本家からObjective-C / Swiftライブラリが提供されていないということで、簡単な紹介にとどめ
る。
ProtocolBuffersと比較される符号化方式となるが、特徴なのはC#がサポートされていて、Unityで利用
できるということ。これで採用されているプロジェクトがあるようだ。
// Create a BookInfo object and populate it:
var info = BookInfo()
info.id = 1734
info.title = "Really Interesting Book"
info.author = "Jane Smith"
// As above, but generating a read-only value:
let info2 = BookInfo.with {
$0.id = 1735
$0.title = "Even More Interesting"
$0.author = "Jane Q. Smith"
}
// Serialize to binary protobuf format:
let binaryData: Data = try info.serializedData()
// Deserialize a received Data object from `binaryData`
let decodedInfo = try BookInfo(serializedData: binaryData)
// Serialize to JSON format as a Data object
let jsonData: Data = try info.jsonUTF8Data()
// Deserialize from JSON format from `jsonData`
let receivedFromJSON = try BookInfo(jsonUTF8Data: jsonData)
エンコード / デコードの例

More Related Content

PPTX
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
PPT
jBOLT Ver3.2
PDF
SharePoint Business Connectivity Services を使用した外部アプリケーション連携
PPTX
Clrh 110716 wcfwf
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PPTX
SmartBBSとデスクトップアプリ
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PDF
Node.jsアプリの開発をモダン化するために取り組んできたこと
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
jBOLT Ver3.2
SharePoint Business Connectivity Services を使用した外部アプリケーション連携
Clrh 110716 wcfwf
Application development with c#, .net 6, blazor web assembly, asp.net web api...
SmartBBSとデスクトップアプリ
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Node.jsアプリの開発をモダン化するために取り組んできたこと

Similar to Web API 通信の符号化について (20)

PDF
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
PDF
Ajax basic
PDF
IBM Blluemix を Pepper とつないでみよう
PDF
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
PDF
New Features of DotNet 6 Blazor WASM
PDF
デモで楽しむ Visual Studio 2022 & .NET 6 最新アップデート
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PPTX
DotNetConf2024の資料 BlazorとLowCodeと生成AIの話です
PPTX
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
PDF
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
PDF
.NET の過去、現在、そして未来
PDF
G0042 h
PPT
Inside mobage platform
PDF
[Japan Tech summit 2017] DEP 005
PDF
DEV-008_Developing on the Edge. ~Web プラットフォームと Cordova~
PDF
エンタープライズ.Net light switch
PPTX
勉強会資料①
PPTX
Azure IoT Edge の基本
PDF
BPStudy20121221
PPT
Mongodb
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
Ajax basic
IBM Blluemix を Pepper とつないでみよう
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
New Features of DotNet 6 Blazor WASM
デモで楽しむ Visual Studio 2022 & .NET 6 最新アップデート
Application development with c#, .net 6, blazor web assembly, asp.net web api...
DotNetConf2024の資料 BlazorとLowCodeと生成AIの話です
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の過去、現在、そして未来
G0042 h
Inside mobage platform
[Japan Tech summit 2017] DEP 005
DEV-008_Developing on the Edge. ~Web プラットフォームと Cordova~
エンタープライズ.Net light switch
勉強会資料①
Azure IoT Edge の基本
BPStudy20121221
Mongodb
Ad

More from 幸雄 村上 (20)

PDF
アプリケーション識別子.pdf
PDF
圧縮ネイティブ・ライブラリについて.pdf
PDF
分散環境におけるジャストインタイム設定の試み
PDF
SwiftのOptionalを理解する
PDF
え!それって参照渡し?
PDF
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
PDF
AppleScriptなど
PDF
MojaveのDark Mode
PDF
AppleScriptとは何ぞや
PPTX
Master-Detail App を実装する
PPTX
SwiftのOptionalを理解する
PPTX
Getting a packet trace
PPTX
The Bash in Tokyo : AppKitとUIKit
PPTX
PPTX
Swiftでブロックチェーンを実装する
PPTX
ゲームの企画書づくりに挑戦
PPTX
IBM Watson Services for Core ML
PPTX
独自Documentクラス
PPTX
独自Documentクラス
PPTX
Bukuro.makers
アプリケーション識別子.pdf
圧縮ネイティブ・ライブラリについて.pdf
分散環境におけるジャストインタイム設定の試み
SwiftのOptionalを理解する
え!それって参照渡し?
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
AppleScriptなど
MojaveのDark Mode
AppleScriptとは何ぞや
Master-Detail App を実装する
SwiftのOptionalを理解する
Getting a packet trace
The Bash in Tokyo : AppKitとUIKit
Swiftでブロックチェーンを実装する
ゲームの企画書づくりに挑戦
IBM Watson Services for Core ML
独自Documentクラス
独自Documentクラス
Bukuro.makers
Ad

Web API 通信の符号化について