如何使用Retrofit解决IllegalArgumentException“格式错误的内容类型:...”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Retrofit解决IllegalArgumentException“格式错误的内容类型:...”相关的知识,希望对你有一定的参考价值。

我已经测试了speech recognition API by Microsoft从短音频文件中获取字符串。这个API不需要格式良好的媒体类型(这真的没有格式良好吗?只有Retrofit或Okhttp?)。

Content-Type: audio/wav; codec=audio/pcm; samplerate=16000

所以我将它设置为Retrofit界面,如下所示。

 @Multipart
    @POST("/speech/recognition/{recognitionMode}/cognitiveservices/v1")
    Observable<Recognition> getRecgnition(
            @Header("Ocp-Apim-Subscription-Key") String subscriptionKey,
            @Header("Content-Type") String contentType,
            @Path("recognitionMode") String recognitionMode,
            @Query("language") String language,
            @Query("format") String format,
            @Part("file")RequestBody file
    );

然后我在发送带有此标头的音频文件的请求中收到错误。我知道原因是因为MediaType#parse将返回null,因为Matcher#lookingAt将返回false

好的,我明白了。但我不知道如何忽略这个例外。能不能给我一些建议来避免这个错误?

java.lang.IllegalArgumentException: Malformed content type: audio/wav;codec=audio/pcm; samplerate=16000
     at retrofit2.RequestBuilder.addHeader(RequestBuilder.java:81)
     at retrofit2.ParameterHandler$Header.apply(ParameterHandler.java:79)
     at retrofit2.ServiceMethod.toRequest(ServiceMethod.java:111)
     at retrofit2.OkHttpCall.createRawCall(OkHttpCall.java:184)
     at retrofit2.OkHttpCall.execute(OkHttpCall.java:168)
     at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:40)
     at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:24)
     at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:36)
     at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:28)
     at rx.Observable.unsafeSubscribe(Observable.java:10256)
     at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
     at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
     at java.lang.Thread.run(Thread.java:762)

以上是关于如何使用Retrofit解决IllegalArgumentException“格式错误的内容类型:...”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit2 和 GSON 转换器解决“古怪”的 JSON API

一起Talk Android吧(第五百零三回:解决retrofit被混淆后代码出错的问题)

如何使用 Retrofit2 处理嵌套 JsonObjects 的动态字段

Retrofit源码分析&实践Retrofit 多BaseUrl问题解决

急速开发系列——Retrofit中如何正确的使用https?

OkHTTP、Retrofit 中文乱码解决方法