UnityでC#でHTTP GETおよびPOSTリクエストを送信するにはどうすればよいですか?
私が欲しいのは:
私が試したもの:
ほとんどの問題はスレッドに関するもので、C#での経験は十分ではありません。私が使用するIDEはIntellij Riderです。
WWW
APIでこれを行う必要がありますが、UnityWebRequest
で置き換えたため、新しいAPIに回答します。本当に簡単です。 UnityのAPIでこれを行うにはコルーチンを使用する必要があります。そうでない場合は、C#標準Web要求APIとスレッドのいずれかを使用する必要があります。コルーチンを使用すると、完了するまでリクエストを生成できます。これは、メインスレッドをブロックしたり、他のスクリプトの実行を妨げたりすることはありません。
注:
以下の例では、以下を使用している場合Unity 2017.2、SendWebRequest()
をSend()
に置き換えてからisNetworkError
with isError
。これは、Unityの下位バージョンで機能します。また、ダウンロードしたデータにバイナリ形式でアクセスする必要がある場合は、uwr.downloadHandler.text
をuwr.downloadHandler.data
に置き換えます。最後に、SetRequestHeader
関数を使用して、リクエストのヘッダーを設定します。
GETリクエスト:
void Start()
{
StartCoroutine(getRequest("http:///www.yoururl.com"));
}
IEnumerator GetRequest(string uri)
{
UnityWebRequest uwr = UnityWebRequest.Get(uri);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}
フォームでのPOSTリクエスト:
void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com"));
}
IEnumerator PostRequest(string url)
{
WWWForm form = new WWWForm();
form.AddField("myField", "myData");
form.AddField("Game Name", "Mario Kart");
UnityWebRequest uwr = UnityWebRequest.Post(url, form);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}
JsonでのPOST要求:
void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com", "your json"));
}
IEnumerator PostRequest(string url, string json)
{
var uwr = new UnityWebRequest(url, "POST");
byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
uwr.uploadHandler = (UploadHandler)new UploadHandlerRaw(jsonToSend);
uwr.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
uwr.SetRequestHeader("Content-Type", "application/json");
//Send the request then wait here until it returns
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}
Multipart FormData/Multipart Form Fileを使用したPOST要求:
void Start()
{
StartCoroutine(postRequest("http:///www.yoururl.com"));
}
IEnumerator PostRequest(string url)
{
List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));
UnityWebRequest uwr = UnityWebRequest.Post(url, formData);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}
PUTリクエスト:
void Start()
{
StartCoroutine(putRequest("http:///www.yoururl.com"));
}
IEnumerator PutRequest(string url)
{
byte[] dataToPut = System.Text.Encoding.UTF8.GetBytes("Hello, This is a test");
UnityWebRequest uwr = UnityWebRequest.Put(url, dataToPut);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Received: " + uwr.downloadHandler.text);
}
}
リクエストの削除:
void Start()
{
StartCoroutine(deleteRequest("http:///www.yoururl.com"));
}
IEnumerator DeleteRequest(string url)
{
UnityWebRequest uwr = UnityWebRequest.Delete(url);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Error While Sending: " + uwr.error);
}
else
{
Debug.Log("Deleted");
}
}
HttpClientと次のようなものを使用します。
public static HttpContent DoPost(object payload, string subPath)
{
var httpClient = new HttpClient();
HttpClient.BaseAddress = new Uri(Global.BaseUrl);
HttpClient.DefaultRequestHeaders.Clear();
HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // if you're using json service
// make request
var response = Global.HttpClient.PostAsJsonAsync(subPath.TrimLeadingSlash(), payload).Result;
// check for error
response.EnsureSuccessStatusCode();
// return result
return response.Content;
}
ペイロードは、jsonにシリアル化されるオブジェクトです。すべてのリクエストが同じbaseUrlに送信される場合、HttpClientをグローバルに設定し、ここで再利用できます