Выполнение POST-запроса к веб-сервисам Vuforia всегда приводит к «Fail», даже если PUT-запрос всегда работает с использованием одного и того же подхода / тела. - PullRequest
0 голосов
/ 07 января 2020

Я разрабатываю приложение Android в Unity. Я пытаюсь заставить UnityWebRequests работать с API веб-сервисов Vuforia. В настоящее время работает каждый метод - GET / PUT / DELETE, но я ничего не могу POST, я всегда получаю сообщение об ошибке:

Error:Generic/unknown HTTP error
Response code:400

Даже если согласно документации Vuforia POST требуется то же тело запроса, что и PUT, и я генерирую его, используя тот же подход:

public string CreateNewUpdateBody(Text name, Text width, RawImage image, Toggle active_flag, Text application_metadata)
{
    dynamic BodyData = new System.Dynamic.ExpandoObject();

    if (!string.IsNullOrEmpty(name.text))
    {
        BodyData.name = name.text; // mandatory for post
    }
    if (!string.IsNullOrEmpty(width.text))
    {
        BodyData.width = float.Parse(width.text); // mandatory for post
    }
    if (image.texture != null)
    {
        Texture2D texture = (Texture2D)image.texture;
        BodyData.image = System.Convert.ToBase64String(ImageConversion.EncodeToJPG(texture)); // mandatory for post
    }
    if (active_flag.interactable)
    {
        BodyData.active_flag = active_flag.isOn;
    }
    if (!string.IsNullOrEmpty(application_metadata.text))
    {
        BodyData.application_metadata = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(application_metadata.text));
    }
    string json = JsonConvert.SerializeObject(BodyData);

    Debug.Log("Body data: " + json);

    return json;
}

Затем я отправляю веб-запрос следующим образом:

private IEnumerator PostTarget(MonoBehaviour mono, string postBody)
{
    var request = UnityWebRequest.Post(url + "/targets", postBody);

    SetHeaders(request); // Must be done after setting the body

    Debug.Log("Starting request " + request.method + " " + request.url);

    yield return request.SendWebRequest();

    while (!request.isDone) yield return null;

    if (request.isHttpError || request.isNetworkError)
    {
        Debug.LogError("Request was not completed");
        Debug.LogError("Error:" + request.error + " Response code:" + request.responseCode);
        Debug.LogError(request.downloadHandler.text); // result_code is always just "Fail"
        mono.StopAllCoroutines();
        yield break;
    }
    else
    {
        Debug.Log("Request completed successfuly!");
        Debug.Log(request.downloadHandler.text);
    }

    response = JsonUtility.FromJson<ResponsePostNewTarget>(request.downloadHandler.text);

    Debug.Log("\nCreated target with id: " + response.target_id);
}

Есть какие-нибудь мысли или предложения? Я ценю время, которое вы потратили, чтобы прочитать это.

1 Ответ

1 голос
/ 07 января 2020

Если все работает НО при публикации данных, либо 1 vuforia не поддерживает это, либо 2 (скорее всего) что-то упустили.

Попробуйте добавить это к вашему запросу

private UploadHandler GetUploadHandler(string postBody)
{
    UploadHandler handler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(postBody));
    handler.contentType = "application/json";
    return handler;
}

И назовите его после SetHeaders

request.uploadHandler = GetUploadHandler(postBody);
...