web-dev-qa-db-ja.com

Unityを使用してC#でhttp要求を送信する

UnityでC#でHTTP GETおよびPOSTリクエストを送信するにはどうすればよいですか?

私が欲しいのは:

  • ポストリクエストでjsonデータを送信します(Unityシリアライザーを使用しているため、新しいシリアライザーは必要ありません。単にポストデータで文字列を渡し、ContentTypeをapplication/jsonに設定する必要があります)。
  • 問題なく応答コードと本文を取得します。
  • uIレンダリングをブロックせずにすべて非同期で実行します。

私が試したもの:

  • httpWebRequest/HttpWebResponseを使用して実装しますが、難しすぎて低レベルです(これ以上良いものが見つからない場合は、使用する必要があります)。
  • 単一のWWWを使用しますが、私の要件と一致しません。
  • nuGetの外部パッケージを使用する-Unityはそれらを受け入れません:(

ほとんどの問題はスレッドに関するもので、C#での経験は十分ではありません。私が使用するIDEはIntellij Riderです。

24
Kamo Spertsian

WWW AP​​Iでこれを行う必要がありますが、UnityWebRequestで置き換えたため、新しいAPIに回答します。本当に簡単です。 UnityのAPIでこれを行うにはコルーチンを使用する必要があります。そうでない場合は、C#標準Web要求APIとスレッドのいずれかを使用する必要があります。コルーチンを使用すると、完了するまでリクエストを生成できます。これは、メインスレッドをブロックしたり、他のスクリプトの実行を妨げたりすることはありません。

以下の例では、以下を使用している場合Unity 2017.2SendWebRequest()Send()に置き換えてからisNetworkError with isError。これは、Unityの下位バージョンで機能します。また、ダウンロードしたデータにバイナリ形式でアクセスする必要がある場合は、uwr.downloadHandler.textuwr.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");
    }
}
60
Programmer

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をグローバルに設定し、ここで再利用できます

1
Jonathan