当在SAP REST API上调用HTTP-POST时,Unity会发生400个不良请求



我想用unity-script调用REST API,但会遇到错误

400不良请求

也许是因为http-header。也许你可以帮助我。SAP在Java中提供代码片段,我想先向您展示:

DataOutputStream dataOut = null;
BufferedReader in =null;
try {
//API endpoint for API sandbox 
  String url = "https://sandbox.api.sap.com/mlfs/api/v2/image/scene-text- 
recognition";

  //Available API Endpoints
  //https://mlfproduction-scene-text- 
  recognition.cfapps.eu10.hana.ondemand.com/api/v2/image
  //https://mlfproduction-scene-text- 
  recognition.cfapps.us10.hana.ondemand.com/api/v2/image
  URL urlObj = new URL(url);
  HttpURLConnection connection = (HttpURLConnection)         
urlObj.openConnection();
  //setting request method
  connection.setRequestMethod("POST");
  //adding headers
  connection.setRequestProperty("content-type","multipart/form-data;                 
  boundary=---011000010111000001101001");
  //API Key for API Sandbox
  connection.setRequestProperty("APIKey","----api-Key---");

  //Available Security Schemes for productive API Endpoints
  //OAuth 2.0
  connection.setDoInput(true);
  //sending POST request
    connection.setDoOutput(true);
  dataOut = new DataOutputStream(connection.getOutputStream());
  dataOut.writeBytes("-----011000010111000001101001rnContent-            
Disposition: form-data; name="files"; filename="<file_name>"rnContent-Type: <file_type>rnrn<file_contents>rn-----011000010111000001101001--");
  dataOut.flush();
  int responseCode = connection.getResponseCode();
  in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  String inputLine;
  StringBuffer response = new StringBuffer();
  while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
  }
  //printing response
  System.out.println(response.toString());
} catch (Exception e) {
  //do something with exception
  e.printStackTrace();
} finally {
  try {
    if(dataOut != null) {
      dataOut.close();
    }
    if(in != null) {
      in.close();
    }
  } catch (IOException e) {
    //do something with exception
    e.printStackTrace();
  }
}

我的UnityCode看起来像这样:

public void ExecutePost()
 {
     Debug.Log("execute started");
     byte[] img =     
     File.ReadAllBytes(@"C:UsersInnovationLabDocumentsECENTAECENTA 
 FSEBild1.jpg");
     string url = "https://sandbox.api.sap.com/mlfs/api/v2/image/scene- 
text-recognition";
     coroutine = Post(url, img);
     StartCoroutine(coroutine);
 }

public IEnumerator Post(string url,byte[] image)
{
    WWWForm form = new WWWForm();
    form.AddBinaryData("imageField", image, "HoloImg");
    var headers = new Dictionary<string, string> {
        {"content-type", "multipart/form-data; boundary=---011000010111000001101001" },
        {"APIKey", "---here I implemented the key---" }
    };
    WWW www = new WWW(url, image, headers);
    yield return www;
    if (www.error != null && www.error != "")
    {       // on error, show information and return
        Debug.Log("Network Error occured: " + www.error);
        yield break;
    }
    while (!www.isDone)
    {
        Debug.Log(www.text);
    }
    
  }
}

所以我的问题是,如何更改统一代码以使其有效?

i通过使用多阶构想修复了它。问题在于API预期的是data而不是二进制阵列。

 public IEnumerator Upload(string url, byte[] img)
{
    List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
    MultipartFormFileSection myFormFile = new MultipartFormFileSection("files", img, 
"Bild1.jpg", "multipart/form-data");
    formData.Add(myFormFile);
    Debug.Log(formData.ToString());
    UnityWebRequest www = UnityWebRequest.Post(url, formData);
    www.SetRequestHeader("APIKey", "<api-key>");
    yield return www.SendWebRequest();
    if (www.isNetworkError || www.isHttpError)
    {
        throw new Exception(www.downloadHandler.text ?? www.error);
    }
    else
    {
        Debug.Log("Done!!!!!");
    }
    Debug.Log(www.downloadHandler.text);
    var ResultObject = JsonUtility.FromJson<TextPrediction>(www.downloadHandler.text);
    foreach (var result in ResultObject.texts)
    {
    }
}

相关内容

  • 没有找到相关文章

最新更新