URLトランザクションとフォーマット
このセクションでは、SenseTalkを使用して、そのURLを通じてインターネット上のリソースにアクセスする方法について説明します。このメカニズムを通じて、SenseTalkはインターネット全体のファイルやウェブサイトの内容にアクセスし、標準プロトコルを使用してリモートサーバーと通信することができます。
標準的なURLフォーマット間で情報を変換するために使いやすいいくつかのサポート関数が用意されています。
スクリプト内でURLリソースを参照する
スクリプト内でURLを通じてアクセスしたファイルやその他のインターネットリソースを参照するには、ファイルやリソースのURLを評価する式に続いて url
という単語を使用します。
urlString は“file:”、“http:”、または“ftp:”タイプのURLである可能性があります。 “file:”タイプのURLはコンテナとして扱うことができます - ファイルへの書き込みアクセスがある場合、その内容を保存したり変更したりすることができます。 urlPropertyList を使用する場合、それは makeURL()
関数によって定義される“scheme”、“host”、“path”、“query”などのキーを含むことができます。
この構文を使用してインターネットからhttpリソースを取得するとき、http GET操作が使用されます。 urlString または urlPropertyList には、フォームを提出することをシミュレートするためのクエリデータを含めることができます。文字列を使用する場合、makeURL()
関数を使用して正しくフォーマットされたクエリを含む文字列を簡単に構築することができます。
with headers headerPropertyList が指定されている場合、headerPropertyList はそのURLにアクセスする際に使用するカスタムHTTPヘッダーを含むプロパティリストであるべきです。カスタムヘッダー情報は、GET(URLにアクセスするとき)とPOST(post
コマンドを使用するとき)の両方の操作に対して任意の標準ヘッダーと一緒に渡されます。
URLにアクセスした後、スクリプトの次の行で result() 関数を呼び出すことで、リモート操作のステータスを確認することができます。これは、リクエストのステータス値がエラーとして扱われる最小レベル(the URLErrorLevel
グローバルプロパティによって指定された)未満の場合、またはステータスがそのレベルまたはそれ以上であり、the throwExceptionResults
がfalseに設定されている場合、例外を返します。
URLから取得したデータは、the defaultStringEncoding
グローバルプロパティの現在の設定に従ってテキストとして解釈されます。URLデータを取得する前に、このプロパティを正しいエンコーディング(通常は "UTF8")に設定します。
構文:
url urlString {with headers headerPropertyList}
url urlPropertyList {with headers headerPropertyList}
例:
url "http://www.somewhere.com/somepage" を htmlContents に put
htmlContents を url "file://localhost/localCopy" に put
例:
{scheme:"http", host:"www.apple.com"} を applePage に put
URL動作の設定
SenseTalkには、スクリプトからアクセスするURLの動作に影響を与えるために使用できるいくつかのグローバルプロパティが含まれています。
the URLCacheEnabled
: URLリソースから取得した内容がキャッシュされるかどうかを制御します。the URLTimeout
: URLリクエストがタイムアウトする前の最大時間を指定します。the URLErrorLevel
: URLの内容を取得する際にエラーとして扱われる最低のURLステータス値を設定します。
これらのグローバルプロパティは、それぞれURLとソケットのためのグローバルプロパティで詳しく説明されています。
インターネットとURLのコマンドと関数
SenseTalkは、インターネット上でトランザクションを行ったり、URLやデータを標準フォーマットで操作したりするためのいくつかのコマンドと関数を提供しています。
post
コマンドは、URLにデータを投稿し、結果を取得します。makeURL()
関数は、指定された一連のコンポーネントから適切に形成されたURL文字列を作成するのに役立ち、そのコンパニオンであるextractURL()
関数は、URL文字列からコンポーネントを抽 出します。URLEncodeおよびURLDecode関数は、URLのクエリやネットワークを通じて渡されるデータで一般的に使用される特殊なエンコード形式へのテキストの変換とその変換を行います。
Post
コマンド
動作: post
コマンドを使用して、オンラインのWebベースのサービスとのトランザクションを行ったり、Webフォームの投稿をシミュレートしたり、Webサーバーとの類似のやり取りを行います。Webサーバーが返す結果は、変数it
に格納されます。
_data_は任意のテキスト文字列、またはプロパティリストであることができます。プロパティリストの場合、自動的に標準のクエリフォーマットにフォーマットされます。post
コマンドは、the URLTimeout
グローバルプロパティによって指定された最大時間までWebサーバーからのレスポンスを待ってからスクリプトの次の行に進みます。受け取ったレスポンスはすべて、変数it
に格納されます。指定された時間内にレスポンスが受信されなかったり、その他のエラーが発生したりすると、it
は空になり、the result
はエラーを示す例外オブジェクトに設定されます。
構文:
post data to url theURL
例:
queryDataをurl "http://someservice.net"にpostする、ヘッダーは{"Content-Type": "text/xml"}
例:
URLEncode(dataToPost)をurl makeURL(urlComponents)にpostする
postResultsにそれを入れる
Post Multipart
コマンド
動作: サーバーにマルチパートデータを投稿します。 contentToSend は、単一のテキスト値またはファイルの内容を含む値のリスト、またはデータが送信される形式に対してより多くの制御を提供したり、内容に関する追加情報を提供するためのプロパティリストまたはプロパティリストのリストです。 "as data" を指定すると、ファイルの内容がBase64でエンコードされます。ファイル名を含めることは任意ですが、ファイルを送信する場合は推奨されます。
md 構文:
post multipart contentToSend to URL serverURL
例:
multipart {filename:"/tmp/xyz", body:file "/tmp/xyz" as data}をURL serverURLにpostする
Tech Talk
投稿されるコンテンツの全体的なルールは次のとおりです:
- コンテンツの値がリストである場合、リスト内の各アイテムはマルチパートコンテンツの別々のパートとして扱われ、以下のルールが各パートに適用されます(個々のパートはリストであってはならず、サブパートはサポートされていません)。
- コンテンツの値がバイナリデータ値(通常は"as data"オペレータを使用して達成)の場合、ボディは自動的にbase64でエンコードされ、適切なContent-TypeおよびContent-Transfer-Encodingヘッダー値が供給されます。
- コンテンツの値がバイナリデータでなく、プロパティリストでもない場合、コンテンツの文字列値がボディとして使用され、"Content-Type: text/plain"ヘッダーが供給されます。
- コンテンツの値がプロパティリストの場合、ボディコンテンツとオプションのヘッダー情報を提供します。以下のプロパティには特別な意味があります:
- Body: 必須です。その値は、データまたはテキスト文字列値、またはこれらのルールによって説明されているように、トップレベルでのみ、コンテンツ値のリストとしてのこのパートのボディコンテンツです。
- Header: 追加のヘッダーフィールドを定義するプロパティリスト。これは、コンテンツプロパティリストの他のキーと同じ名前のヘッダーが必要な場合にのみ必要です。それ以外の場合、ヘッダーのキー/値のペアはコンテンツプロパティリストに直接含めることができます。
- Disposition: "Content-Disposition"ヘッダーの形成に使用されます。適切な値は"inline"、"attachment"などです。指定されていない場合、"form-data"が使用されます。
- FieldName: "Content-Disposition"ヘッダーの形成に使用されます。フォームフィールド名が指定されていない場合、"field1"、"field2"などの名前が自動的に生成されます。
- FileName: "Content-Disposition"ヘッダーの形成に使用されます。指定されている場合、これはContent-Dispositionヘッダーの一部として含まれます。ファイルをアップロードするときはFileNameを含めることを推奨します。
プロパティリストがトップレベルで使用される場合(リスト内のパートとしてではない場合)、特別なルールが適用されます。このレベルのBodyはリストにすることができます。また、以下の追加のプロパティが認識されます:
- MultipartBoundary: パートを区切るために使用されるテキスト文字列(指定されていない場合、適切な文字列が自動的に生成されます)。カスタムの"Content-Type"ヘッダーがトップレベルで供給される場合、それは境界文字列を含むべきであり、MultipartBoundaryはその境界文字列をその値として含める必要があります。
- TopHeader: メッセージのトップレベルで追加のヘッダーフィールドを定義するプロパティリスト。または、URLに投稿する際にheaders headerFieldsを指定で指定することで、トップレベルのヘッダーフィールドを提供することができます。"MIME-Version"プロパティがTopHeaderに指定されていない場合、自動的に"1.0"の値が含まれます。"Content-Type"プロパティが含まれていない場合、"multipart/form-data"のコンテンツタイプと、MultipartBoundaryプロパティによって定義される境界文字列(または指定されていない場合は自動的に生成される)を指定するものが自動的に生成されます。
メッセージのそのパートのヘッダーフィールドとして扱われる特別な意味を持たない各パートの追加のプロパティがあります。以下のヘッダーフィールドは、それらがコンテンツプロパティリストまたはそのHeaderプロパティリストに含まれていない場合、自動的に生成されます:
- "Content-Disposition"プロパティが含まれていない場合、Disposition、FieldName、およびFileNameまたはそれらのデフォルトの値を使用して、Content-Dispositionヘッダーが自動的に生成されます。これらのプロパティについては、上記を参照してください。
- "Content-Type"プロパティが含まれていない場合、Content-Typeヘッダーが自動的に生成されます。
MultipartMIME
関数
動作: post multipart
コマンドで送信されるように、指定されたコンテンツのBodyとHeader情報を含むプロパティリストを生成します。これは問題のトラブルシューティングやHTTPメッセージをテキストとして構築するために役立ちます。この関数は、単一の値、値のリスト、またはプロパティリストまたはプロパティリストのリストで呼び出すことができます。詳細については、Post Multipart
コマンドを参照してください。
multipartMIME
関数によって返される値は、Bodyプロパティの値がmultipart-MIME形式の完全にフォーマットされた文字列であるプロパティリストです。Headerプロパティは、Bodyテキストに付随する適切なヘッダーを含むプロパティリストです。
例:
put (multipartMIME("Secret Message" as data) adding {request:"/"}) as http
JSONFormat
関数
動作: 任意のSenseTalk値のためのJSON形式のテキストを生成します。JSONformat
関数を使用して、他のプログラムで使用するためのJSON形式のテキストを生成したり、ウェブサービスや他のJSON形式を使用するプロセスにデータを送信するために使用します。_valueToFormat_は、リストやプロパティリストを含む任意のSenseTalk値であることができます。リスト、プロパティリスト、テキスト、数字以外の値(例えば、日付や色)は、フォーマットする前にテキストに変換されます。
大部分の場合、SenseTalkの値は自動的にフォーマットされた出力内の対応するタイプにマッピングされます。SenseTalkリストはJSONリストになり、SenseTalkプロパティリストはJSONオブジェクトになります。ただし、時々、個々の要素について「数値として」、「文字列として」(または「テキストとして」)、または「ブール値として」を指定する必要があるかもしれません。これは、SenseTalkが通常、文字列と数値の値を区別しないためです - それは単にコンテクストや操作に応じて値を必要に応じて変換します。しかし、JSONとしてフォーマットする場合、SenseTalkは文字列が必要か数値が必要かを知る方法がありません。
構文:
JSONFormat( valueToFormat )
{the} JSONFormat of valueToFormat
例:
put contentValue's JSONFormat into file outfile
例:
この例では、JSONFormat
関数を使用して、リストされている値を持つJSON文字列を返すSenseTalk呼び出しを示しています:
set listOfValues to ["a",Yes,"0500",22]
put JSONFormat(listOfValues)
上記の例からのJSON出力は以下のようになります:
["a",true,"0500",22]
"はい"をテキストとして、0500を数値として、22を文字列と して持つためには、このようにコードで指定することができます:
set listOfValues to ["a", Yes as text, "0500" as a number, 22 as a string]
put JSONFormat(listOfValues)
上記からの出力は現在このようになっています:
["a","Yes",500,"22"]