Я пытаюсь отправить изображение как base64 на сервер узла и получить в качестве ответа другое изображение как base64. На сервере узла изображение сохраняется в каталоге сервера, и ответ отправляется после завершения выполнения файла Python.
Я получаю сообщение об ошибке тайм-аута при использовании Retrofit с kotlin. Когда я использую Почтальон, все работает отлично.
Вот код создания Retrofit:
var okHttpClient: OkHttpClient = OkHttpClient.Builder()
.readTimeout(10, TimeUnit.MINUTES)
.writeTimeout(10,TimeUnit.MINUTES)
.connectTimeout(2,TimeUnit.MINUTES)
.build();
public val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
.baseUrl("http://18.191.40.41:8081/")
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
public val sendImageApi = retrofit.create(ApiService::class.java)
Код для сервиса Api:
@POST("test/")
@FormUrlEncoded
@Headers("Content-Type: application/x-www-form-urlencoded")
fun sendImage(@Field("inputImage") inputImage: String): Call<ImageResponse>;
Код для отправки изображения через API:
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream)
val image = stream.toByteArray()
var response = sendImageApi.sendImage(Base64.encodeToString(image,0))
response.enqueue(object :Callback<ImageResponse>{
override fun onResponse(call: Call<ImageResponse>?, response: Response<ImageResponse>?) {
Toast.makeText(activity,response?.body()?.toString(),Toast.LENGTH_SHORT).show()
revertBtn.visibility = View.GONE
sendBtn.visibility = View.GONE
openCamera.visibility = View.GONE
val imageBytes = Base64.decode(response.toString(), 0)
val image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
imageView.setImageBitmap(image)
}
override fun onFailure(call: Call<ImageResponse>?, t: Throwable) {
imageView.visibility=View.GONE
Toast.makeText(activity, t.message, Toast.LENGTH_SHORT).show()
}
})
Код узла JS-сервера:
var http = require('http');
scriptPath = './imps/test.py';
var cors = require('cors')
const fs = require('fs');
const files = fs.readdirSync('./');
var Pythonshell = require('python-shell');
var express = require('express');
var app = express();
var port = 8081;
app.use(cors())
app.use(express.static('./'));
app.set('view engine', 'ejs');
var bodyParser = require('body-parser');
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true ,limit: '10mb'}));
app.use(function(req,res,next){
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept");
next();
});
app.post('/test', function(req, res) {
console.log("request received")
img=req.body.inputImage
fs.writeFile("./testImg/inputImage.jpg",img ,'base64', function(err) {
if(err) {
return console.log(err);
}
});
Pythonshell.PythonShell.run(scriptPath, {args:['inputImage.jpg']}, function (err, results) {
if (err) throw err;
console.log(" python file called")
console.log(results)
var img = new Buffer(fs.readFileSync('./imps/result.png')).toString('base64');
res.send(img);
});
// start the server
});
Я хочу получить строку или объект в качестве ответа, содержащий изображение base64.