Estou desenvolvendo um aplicativo Flask para processar imagens enviadas de um dispositivo móvel antes de enviar os resultados de volta para o aplicativo. Implantei o aplicativo Flask com sucesso no Azure e posso confirmar que ele funciona com determinados caminhos, /test
por exemplo.
O caminho que meu aplicativo móvel usa para carregar uma imagem é /upload-data
. Quando executo meu aplicativo Flask localmente no meu próprio PC e me conecto a ele, esse caminho funciona bem, aceitando a imagem carregada e retornando uma resposta.
No entanto, ao usar o aplicativo Flask implantado no Azure, a resposta que recebo /upload-data
é apenas 405 (Método não permitido).
Esta é a parte superior do meu código no meu backend Python Flask:
@app.route("/upload-data", methods=['POST'])
def store_data():
#Image processing code etc...
E é assim que eu faço o post para o caminho acima no meu aplicativo Java Android com OkHTTP:
private void uploadData(String imagePath, String pointCloudPath) {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(responseTimeOut, TimeUnit.SECONDS)
.build();
File imageFile = new File(imagePath);
//Create request body
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", imageFile.getName(),
RequestBody.create(imageFile, MediaType.parse("image/jpeg")))
.build();
//Create request itself
String url = "http://" + backendUrl;
Request request = new Request.Builder()
.url(url+"/upload-data")
.post(requestBody)
.build();
//Execute request in background
Log.d("OkHTTP Image Upload", "Creating image upload request to: " + request.url());
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
e.printStackTrace();
Log.e("OkHTTP Image Upload", "Failed: " + e.getMessage());
runOnUiThread(() -> textStatus.setText("Request Failed: " + e.getMessage()));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) {
if (response.isSuccessful()) {
Log.d("OkHTTP Upload", "Success");
InputStream responseZipStream = response.body().byteStream();
runOnUiThread(() -> processAnalysisResponse(responseZipStream));
}
else {
Log.e("OkHTTP Image Upload", "Error: "+response.code());
runOnUiThread(() -> textStatus.setText("Request Error: "+response.code()));
}
}
});
}
Percebi que você está fazendo suas solicitações por HTTP, não por HTTPS. Imagino que o Azure seja mais rigoroso com solicitações POST do que com GET devido à criptografia do corpo da solicitação.
Certifique-se de que o HTTPS esteja desativado somente no Portal do Azure.