LoginSignup
2
0

More than 5 years have passed since last update.

UnityでTHETA Vを操作するときの注意点(UnityWebRequest)

Last updated at Posted at 2018-09-04

はじめに

  • UnityでTHETA V操作アプリを作成しようとしたところ変なところで引っかかったのでメモ

現象

  • UnityWebRequestでTHETA V(v2.41.1)を操作しようとしたところ以下の問題が起きた
    • GETは成功する
    • POSTがAndroid(Galaxy8、OculusGo)で失敗する(Macでは動作)
      • 失敗時は、Request Time Outになる

原因

  • UnityWebRequestのPOST実行時、Android版はヘッダに「Expect: 100-continue」が付くため

対策

  • 「Expect: 100-continue」を外す
    • UnityWebRequest.useHttpContinue = false を設定

実際のコード

ThetaAccessControl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using System;
using System.Text;
using System.IO;


public class ThetaAccessControl {

    public string baseUrl = "http://192.168.1.1";

    public int requestTimeout = 5;

    void Start() {
    }

    public IEnumerator Get(string url, string key, UnityAction<string, string, byte[]> action, UnityAction<string, UnityWebRequest> error) {
        var request = UnityWebRequest.Get(url);
        request.timeout = requestTimeout;

        // リクエスト送信
        yield return request.SendWebRequest();

        // 通信エラーチェック
        if (request.isNetworkError) {
            if (error != null) {
                error(key, request);
            }
        } else {
            if (request.responseCode == 200) {
                if(action != null) {
                    byte[] results = request.downloadHandler.data;
                    action(key, url, results);
                }
            } else {
                if (error != null) {
                    error(key, request);
                }
            }
        }
    }
    public IEnumerator Post(string url, string bodyJsonString, string key, UnityAction<string, string, byte[]> action, UnityAction<string, UnityWebRequest> error) {
        var request = new UnityWebRequest(url, "POST");
        if (bodyJsonString != "") {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(bodyJsonString);
            request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
        }
        request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        request.timeout = requestTimeout;
        request.useHttpContinue = false;

        yield return request.SendWebRequest();

        if (request.isNetworkError) {
            if (error != null) {
                error(key, request);
            } 
        } else {
            if (action != null) {
                string result = request.downloadHandler.text;
                byte[] resultByte = request.downloadHandler.data;
                action(key, result, resultByte);
            }
        }
    }
}

参考

備考

  • これって、、、
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0