Helpex - Trao đổi & giúp đỡ Đăng nhập
34

Làm cách nào để gửi các yêu cầu HTTP GET và POST trong C # với Unity?

Điều tôi muốn là:

  • gửi dữ liệu json trong yêu cầu bài đăng (Tôi sử dụng bộ tuần tự Unity, vì vậy không cần cái mới, tôi chỉ muốn chuyển chuỗi trong dữ liệu bài đăng và có khả năng đặt ContentType thành ứng dụng / json);
  • nhận mã phản hồi và nội dung mà không gặp bất kỳ sự cố nào;
  • làm tất cả không đồng bộ mà không chặn hiển thị ui.

Những gì tôi đã thử:

  • triển khai với HttpWebRequest / HttpWebResponse, nhưng nó quá khó và cấp thấp (nếu tôi không tìm thấy gì tốt hơn, tôi sẽ phải sử dụng nó);
  • sử dụng Uniform WWW, nhưng nó không phù hợp với yêu cầu của tôi;
  • sử dụng một số gói bên ngoài từ NuGet - Unity không chấp nhận chúng :(

Hầu hết các vấn đề là với luồng, tôi không đủ kinh nghiệm về nó trong C #. IDE, tôi sử dụng, là Intellij Rider.

34 hữu ích 4 bình luận 42k xem chia sẻ
90

Các WWWAPI nên thực hiện điều này nhưng UnityWebRequestthay thế nó vì vậy tôi sẽ trả lời các API mới hơn. Nó thực sự đơn giản. Bạn phải sử dụng coroutine để thực hiện việc này với API của Unity, nếu không bạn phải sử dụng một trong các API và Thread yêu cầu web tiêu chuẩn C #. Với chương trình điều tra, bạn có thể đưa ra yêu cầu cho đến khi nó được thực hiện. Điều này sẽ không chặn Luồng chính hoặc ngăn các tập lệnh khác chạy.

Ghi chú :

Đối với các ví dụ bên dưới, nếu bạn đang sử dụng bất kỳ thứ gì bên dưới Unity 2017.2 , hãy thay thế SendWebRequest()bằng Send()và sau đó thay thế isNetworkErrorbằng isError. Sau đó, điều này sẽ hoạt động cho phiên bản Unity thấp hơn. Ngoài ra, nếu bạn cần truy cập dữ liệu đã tải xuống ở dạng nhị phân, hãy thay thế uwr.downloadHandler.textbằng uwr.downloadHandler.data. Cuối cùng, SetRequestHeaderhàm được sử dụng để đặt tiêu đề của yêu cầu.

NHẬN yêu cầu :

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);
    }
}

Yêu cầu ĐĂNG với Biểu mẫu :

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);
    }
}

Yêu cầu ĐĂNG với Json :

 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);
     }
 }

POST yêu cầu với Multipart FormData / Multipart Form File :

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);
    }
}

Yêu cầu 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);
    }
}

Yêu cầu XÓA :

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");
    }
}
90 hữu ích 5 bình luận chia sẻ
2

Sử dụng HttpClient và những thứ như sau:

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;
    }

Tải trọng là một đối tượng được tuần tự hóa thành json. Nếu tất cả các yêu cầu chuyển đến cùng một baseUrl, bạn có thể thiết lập HttpClient trên toàn cầu và sử dụng lại nó tại đây

2 hữu ích 5 bình luận chia sẻ
1

https://www.patrykgalach.com/2019/04/18/how-to-call-rest-api-in-unity/

Vui lòng tham khảo liên kết này một cách sạch sẽ nhất để chơi với dữ liệu

và không sử dụng wwwthay vì sử dụngUnityWebRequest

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# http unity3d , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading