관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 이미지 전송중 Retorift2 관련 에러: Only one encoding annotation allowed 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] 이미지 전송중 Retorift2 관련 에러: Only one encoding annotation allowed

막무가내막내 2020. 7. 3. 15:48
728x90

 

[2020-04-13 업데이트]

 

안드로이드 이미지와 일반 값들을 전송하기 위해 Retrofit2 통신하다가 일어난 에러이다.


이유는 @Multipart , @FormUrlEncoeded, @Body, @Field 는 Retrofit interface 함수에 공존할 수 없습니다.

이거에 대한 말은 아래 링크에서 찾아볼 수 있습니다.

 

@Multipart 사용시 @Part 로 보내줘야합니다.

 

나의 예시)

@Multipart
    @POST("/predict")
    fun getTest(
        @Part file: MultipartBody.Part,
        @Part("y") x: Float,
        @Part("x") y:  Float
    ): Call<ResponseBody>
@Multipart
    @POST("/predict")
    fun getTest(
        @Part file: MultipartBody.Part,
        @Part("x") x: ArrayList<Float>,
        @Part("y") y: ArrayList<Float>
    ): Call<ResponseBody>

 

[서버 Flask 에서는 다음과 같이 받아주었습니다.]

# 파일 업로드
@app.route('/predict', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        print(flask.request.files)
        print(flask.request.form)
        # 내가 찍은 X, Y 좌표 리스트 (Float 형)
        x_list = request.form.getlist('x')
        y_list = request.form.getlist('y')
        print(x_list)
        print(y_list)
        # # 처음 그린 좌표 하나만 세팅
        x_first = x_list[0]
        y_first = y_list[0]
        print(x_first)
        print(y_first)
        # 파일 받기
        f = request.files['image']
        # 그걸 그대로 적당한 파일명 줘서 저장 (뭔지랄을 해도 파일 저장된걸 볼 수가 없음 어따 저장되는겨 싯벌)
        f.save(secure_filename(f.filename))
        print(f.filename)
        sfname = str(secure_filename(f.filename))
        f.save(sfname)
    return "성공"


# 실행에서 메인 쓰레드인 경우, 먼저 모델을 불러온 뒤 서버를 시작합니다.
if __name__ == "__main__":
    print(("* Loading Keras model and Flask starting server..."
           "please wait until server has fully started"))
    load_model()
    # 0.0.0.0 으로 해야 같은 와이파에 폰에서 접속 가능함
    app.run(host='0.0.0.0')

 

 

https://stackoverflow.com/questions/40607862/retrofit-throwing-an-exception-java-lang-illegalargumentexception-only-one-en/40608320

 

Retrofit - throwing an exception java.lang.IllegalArgumentException: Only one encoding annotation is allowed

Hello guys here is my sample code @FormUrlEncoded @Multipart @POST("registration.php") Call getSignupResponse(@Field("email") String email, @Field("ln...

stackoverflow.com

https://stackoverflow.com/questions/45289490/android-retrofit-only-one-encoding-annotation-allowed

 

Android Retrofit Only one encoding annotation allowed

I want to make an API call using Retrofit. The call will basically send some data, together with an image. This is what I've written: @POST("notes/new") @Multipart @FormUrlEncoded Call

stackoverflow.com

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다!!

728x90
Comments