2015-10-07 43 views
2

我正在將現有代碼庫遷移到Retrofit 2,但在理解Multipart請求的新語法時遇到了一些問題。我也在使用Kotlin,儘管除了一些語法上的改變之外,我認爲這個問題應該沒有關係。改進2多部分請求

這就是我現在所擁有的:

val audioDuration = RequestBody.create(null, audioDuration.toString()) 
val file = RequestBody.create(MediaType.parse("audio/mp4"), 
       File(context.filesDir, filename).absoluteFile) 

sendAudioChunk(audioDuration, file).enqueue(callback) 

而這裏的API的定義:

@Multipart 
@POST("path_to_request") 
fun sendAudioChunk(@Part("duration") audioDuration: RequestBody, 
        @Part("audio") audioBlob: RequestBody) : Call<ResponseObject> 

在改造1.9我用TypedString和TypedFile的請求參數,現在看來一個需要使用OkHttp的RequestBody,但由於請求沒有正確執行,我必須丟失一些東西。

+0

傑克沃頓商學院的解決方案這裏是這樣做的推薦方法; https://stackoverflow.com/questions/38507040/how-to-set-dynamic-filename 您可以使用包含文件名的MultipartBody.Part參數創建@Part參數。 –

回答

3

我終於明白了。我的網絡服務期望文件上傳的文件名。這似乎是新的改進2中正在進行的工作支持,但可以通過將其添加到指定的參數定義中來解決問題。

更多細節在這裏:https://github.com/square/retrofit/issues/1140

+0

如果你剛剛展示了一個在這裏做什麼的例子,那將是很好的。這花了我一段時間來淘汰這些線程,以找到正確的解決方案,這不是許多人提倡的(通過轉義引用將其嵌入到RequestBody名稱參數中) –

1

一兩件事,不同的是,TypedString將有一個Content-Type「text/plain的;字符集= UTF-8」,在這裏你是不是設置Context-Type都爲您audioDuration參數。嘗試將其設置爲text/plain以獲得與TypedString相同的行爲(charset默認設置爲utf-8)。

val audioDuration = RequestBody.create(MediaType.parse("text/plain"), audioDuration.toString()) 

如果這不起作用,您需要提供有關「請求無法正確執行」的更多信息。您嘗試複製的工作請求也會有所幫助。

+0

做到了這一點,仍然無法正常工作。我得到一個200,但服務器將消息長度視爲沒有內容。在之前的改造版本中,內容到達了那裏,我以同樣的方式做了其他所有事情(或者至少我認爲是這樣)。如果這有所作爲,服務器將在應用引擎上運行。 – pedronveloso

+0

你有從舊代碼的工作要求的成績單嗎? – iagreen

+0

我的舊代碼是這樣的:http://pastie.org/10465917 – pedronveloso