# Unity Web Request Sending Form

> Send HTML form data to a server using the UnityWebRequest form APIs.

HTML フォームとしてフォーマットされたデータをサーバーに送信するために、2 つの主要な機能があります。WWW システムから移行する場合は、後述の [WWWForm](#UsingWWWForm) の使用を参照してください。

## IMultipartFormSection の使用

フォームデータ指定をどのように指定するかをより細かく制御するために、`UnityWebRequest` システムにはユーザーが実装可能な `IMultipartFormSection` インターフェースが含まれています。標準的なアプリケーションに対して、Unity はデータセクションとファイルセクションのデフォルトの実装を行う `MultipartFormDataSection` と `MultipartFormFileSection` を利用できます。

多重定義である `UnityWebRequest.POST` のは、2 番目のパラメーターとして、List 引数を受け取ります。この引数の要素はすべて `IMultipartFormSections` でなければなりません。関数のシグネチャは以下のようになります。

```
UnityWebRequest.Post(string url, List<IMultipartFormSection> formSections);
```

## 詳細

* この関数は `UnityWebRequest` を作成し、ターゲット URL を 1 番目の文字列のパラメーターに設定します。また、`UnityWebRequest` の Content-Type ヘッダーを `IMultipartFormSection` オブジェクトのリストで指定されたフォームデータ用に、適切に設定します。
* この関数は、デフォルトで `DownloadHandlerBuffer` を `UnityWebRequest` にアタッチします。これは便宜上のもので、これを利用してサーバーの応答を確認することができます。
* `WWWForm POST` 関数と同様に、この HLAPI 関数は、提供された `IMultipartFormSection` を順番に呼び出し、それらを RFC 2616 で指定されている標準マルチパート形式にフォーマットします。
* 事前にフォーマットされたフォームデータは、標準の `UploadHandlerRaw` オブジェクトに格納され、`UnityWebRequest` にアタッチされます。その結果、`UnityWebRequest.POST` の呼び出し後に実行された `IMultipartFormSection` オブジェクトへの変更は、サーバーに送信されるデータには反映されません。

### 例

```
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;

public class MyBehavior : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        var formData = new List<IMultipartFormSection>();
        formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
        formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));

        using var www = UnityWebRequest.Post("https://www.my-server.com/myform", formData);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log("Form upload complete!");
        }
    }
}
```

WWWForm の使用 (古い関数)

WWW システムから移行するために、UnityWebRequest システムでは古い WWWForm オブジェクトを使用してフォームデータを渡すことが可能です。

この場合、関数のシグネチャは以下のようになります。

```
UnityWebRequest.Post(string url, WWWForm formData);
```

## 詳細

* この関数は新しい `UnityWebRequest` を作成し、ターゲット URL を 1 番目の文字列引数に設定します。また、`WWWForm` 引数 (Content-Type など) で生成されたカスタムヘッダーを読み込み、`UnityWebRequest` にコピーします。
* この関数は、デフォルトで `DownloadHandlerBuffer` を `UnityWebRequest` にアタッチします。これは便宜上のもので、これを利用してサーバーの応答を確認することができます。
* この関数は `WWWForm object` によって生成された生データを読み込み、`UploadHandlerRaw` オブジェクトにバッファリングします。そして、これが `UnityWebRequest` にアタッチされます。そのため、`UnityWebRequest.POST` を呼び出した後に `WWWForm` オブジェクトを変更しても、`UnityWebRequest` の内容は変更されません。

### 例

```
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
 
public class MyBehavior : MonoBehaviour {
    void Start() {
        StartCoroutine(Upload());
    }
     
    IEnumerator Upload() {
        WWWForm form = new WWWForm();
        form.AddField("myField", "myData");
     
        using var www = UnityWebRequest.Post("https://www.my-server.com/myform", form);
        yield return www.SendWebRequest();
     
        if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
        }
        else {
            Debug.Log("Form upload complete!");
        }
    }
}
```
