retrofit 相关问题

Retrofit是Square,Inc。的Android和Java类型安全的REST客户端。

当我尝试将昨天的日期添加到 GET 参数(NASA APOD API)时出现“注释参数必须是编译时常量”错误

我在使用 NASA APOD API 创建正确的 @GET 请求时遇到问题。根据文档,我可以使用“日期”参数向请求添加特定日期,例如 date=20...

回答 2 投票 0

注释参数必须是编译时常量

这就是我想做的 @FormUrlEncoded @POST(“改造/POST/signup.php”) 抽象有趣的注册( @Field(Constant().KEY_NAME) 名称:字符串?, @Field(Constant().KEY_CELL) 单元格:St...

回答 2 投票 0

无法为 io.reactivex.Observable 创建调用适配器

我将向我的服务器(它是 Rails 应用程序)发送一个简单的 get 方法,并使用 RxJava 和 Retrofit 获取结果。我所做的事情是: 我的界面: 公共接口 ApiCall { 字符串

回答 4 投票 0

Android kotlin 改造 DefaultDispatcher-worker-1,SLHandshakeException:链验证失败

我使用 viewModelScope 内的改造从 api 获取列表,但收到此错误 E/AndroidRuntime:致命异常:DefaultDispatcher-worker-1 进程:com.example.assignment4,PID:

回答 1 投票 0

Flutter Retrofit 上传分段会抛出 415 不支持的媒体类型

我正在尝试使用以下代码使用 Flutter Retrofit 的 Multipart 上传图像 @POST("apiUrl/上传/文件") @MultiPart() 未来 我正在尝试使用此代码使用 Flutter Retrofit 中的 Multipart 上传图像 @POST("apiUrl/upload/files") @MultiPart() Future<TSSuccessResponse<UploadFileRemoteResponse>> uploadFile( @Part() File file); 然而,它不断收到错误 415,表示不支持 application/form-octet MediaType。 E/flutter ( 8367): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [bad response]: The request returned an invalid status code of 415. E/flutter ( 8367): #0 DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:530:7) E/flutter ( 8367): #1 _RootZone.runBinary (dart:async/zone.dart:1665:54) E/flutter ( 8367): #2 _FutureListener.handleError (dart:async/future_impl.dart:162:22) E/flutter ( 8367): #3 Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47) E/flutter ( 8367): #4 Future._propagateToListeners (dart:async/future_impl.dart:800:13) E/flutter ( 8367): #5 Future._completeError (dart:async/future_impl.dart:575:5) E/flutter ( 8367): #6 _SyncCompleter._completeError (dart:async/future_impl.dart:51:12) E/flutter ( 8367): #7 _Completer.completeError (dart:async/future_impl.dart:23:5) E/flutter ( 8367): #8 Future.any.onError (dart:async/future.dart:617:45) E/flutter ( 8367): #9 _RootZone.runBinary (dart:async/zone.dart:1665:54) E/flutter ( 8367): #10 _FutureListener.handleError (dart:async/future_impl.dart:162:22) E/flutter ( 8367): #11 Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47) E/flutter ( 8367): #12 Future._propagateToListeners (dart:async/future_impl.dart:800:13) E/flutter ( 8367): #13 Future._completeError (dart:async/future_impl.dart:575:5) E/flutter ( 8367): #14 Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:666:7) E/flutter ( 8367): #15 _microtaskLoop (dart:async/schedule_microtask.dart:40:21) E/flutter ( 8367): #16 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5) I/flutter ( 8367): ╔ DioErrorType.badResponse I/flutter ( 8367): ║ { I/flutter ( 8367): ║ statusCode: 415, I/flutter ( 8367): ║ "File type application/octet-stream is not matching: image, pdf, powerpoint, prese I/flutter ( 8367): ║ ntation, video, video/quicktime" I/flutter ( 8367): ║ error: "Unsupported Media Type" I/flutter ( 8367): ║ } I/flutter ( 8367): ╚══════════════════════════════════════════════════════════════════════════════════════════╝ 然后我尝试更改请求以在 @Part() 标记中包含内容类型,正如有人提到的那样,以便它满足从 Retrofit 生成的文件。 @POST("apiUrl/upload/files") @MultiPart() Future<TSSuccessResponse<UploadFileRemoteResponse>> uploadFile( @Part(contentType: "image/png") File file); 但是它抛出了另一个错误,那就是 E/flutter ( 8367): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [bad response]: The request returned an invalid status code of 415. E/flutter ( 8367): #0 DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:530:7) E/flutter ( 8367): #1 _RootZone.runBinary (dart:async/zone.dart:1665:54) E/flutter ( 8367): #2 _FutureListener.handleError (dart:async/future_impl.dart:162:22) E/flutter ( 8367): #3 Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47) E/flutter ( 8367): #4 Future._propagateToListeners (dart:async/future_impl.dart:800:13) E/flutter ( 8367): #5 Future._completeError (dart:async/future_impl.dart:575:5) E/flutter ( 8367): #6 _SyncCompleter._completeError (dart:async/future_impl.dart:51:12) E/flutter ( 8367): #7 _Completer.completeError (dart:async/future_impl.dart:23:5) E/flutter ( 8367): #8 Future.any.onError (dart:async/future.dart:617:45) E/flutter ( 8367): #9 _RootZone.runBinary (dart:async/zone.dart:1665:54) E/flutter ( 8367): #10 _FutureListener.handleError (dart:async/future_impl.dart:162:22) E/flutter ( 8367): #11 Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47) E/flutter ( 8367): #12 Future._propagateToListeners (dart:async/future_impl.dart:800:13) E/flutter ( 8367): #13 Future._completeError (dart:async/future_impl.dart:575:5) E/flutter ( 8367): #14 Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:666:7) E/flutter ( 8367): #15 _microtaskLoop (dart:async/schedule_microtask.dart:40:21) E/flutter ( 8367): #16 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5) I/flutter ( 8367): ╔ DioErrorType.badResponse I/flutter ( 8367): ║ { I/flutter ( 8367): ║ statusCode: 415, I/flutter ( 8367): ║ message: "File type is not matching", I/flutter ( 8367): ║ error: "Unsupported Media Type" I/flutter ( 8367): ║ } I/flutter ( 8367): 我还尝试将 contentType 更改为“image/*”,但它在 MediaType.parser(来自生成的文件)上抛出错误,指出它是无效类型。 在这个场景中我有什么遗漏的吗?以前有人解决过这个问题吗?我尝试了[1],[2]和许多其他人提到的解决方案,但仍然陷入这个问题。提前谢谢。 需要注意的一点:此请求在具有相同文件的 Postman 中正常工作。 我通过将文件解析为 MultipartFiles 并动态设置其 contentType 解决了这个问题。我使用 mime 库来确定文件的 contentType。 将文件解析为MultipartFiles的方法: Future<List<MultipartFile>> filesToMultipartFiles(List<File> files) async { final multipartFiles = <MultipartFile>[]; for (final file in files) { final filename = file.path.split('/').last; final fileBytes = await file.readAsBytes(); List<int> header = []; for (var element in fileBytes) { if (element == 0) continue; header.add(element); } final mime = lookupMimeType(filename, headerBytes: header) ?? ''; final mimeParts = mime.split('/'); if (mimeParts.length != 2) throw Exception('Invalid file type'); final multipartFile = MultipartFile.fromBytes( fileBytes, filename: file.path.split('/').last, contentType: MediaType(mimeParts[0], mimeParts[1]), ); multipartFiles.add(multipartFile); } return multipartFiles; } API类: @RestApi() abstract class _FilesAPI { factory _FilesAPI(Dio dio) = __FilesAPI; @POST('/files') @MultiPart() Future<List<AppFile>> _uploadFile({ @Part(name: 'files[]') required List<MultipartFile> files, }); } class FilesAPI extends __FilesAPI { FilesAPI(Dio dio) : super(dio); Future<List<AppFile>> uploadFile({ required List<MultipartFile> files, }) { return _uploadFile( files: files, ); } } 我找到了问题的答案。有人在 github 中提出了这个问题,显然根本原因问题是 Dio 在我们未指定任何内容时将 MediaType 设置为 application/octet-stream。 如果我们像这样从改造中指定它(通过@Part的contentType), @POST("apiUrl/upload/files") @MultiPart() Future<TSSuccessResponse<UploadFileRemoteResponse>> uploadFile( @Part(contentType: "image/jpg") File file); Retrofit 生成的文件中的以下行仍会抛出错误,因为它与模式不匹配。 MediaType.parse(contentType) 我的解决方案是使用普通的 Dio 请求,然后按照前面的 github 链接的建议,使用 pub.dev 中的 mime 包指定 mime 类型。 import 'package:mime/mime.dart'; FormData data = FormData.fromMap({ "file": await MultipartFile.fromFile(file.path, filename: fileName, contentType: MediaType.parse("${lookupMimeType(fileName)}")), }); final response = await dio.post( "api/uploadFile", data: data, options: Options(headers: {"Content-Type": "multipart/form-data"}), ); 如果您想放弃改造代码生成,则接受的答案是可以的。但如果您仍然想继续使用 Retrofit 和 dio,只需导入您定义 @Multipart 的文件即可。 import 'package:http_parser/http_parser.dart'; 您仍然可以将内容类型保留为 contentType: "application/octet-stream" 如下: @Part(contentType: "application/octet-stream") File file, 这样,改造代码生成引发的错误将消失,因为 MediaType 来自 http_parser 库。

回答 3 投票 0

如何在 Hilt (Android) 中重新初始化单例?

我的 Android 项目中有 Hilt DI 框架。我还进行了改造,并使用 ApiNetworkModule 获取单例改造对象: @模块 @InstallIn(SingletonComponent.class) 公开课

回答 1 投票 0

使用存储库 + LiveData + 协程进行 ViewModel 单元测试

所以我对如何对 ViewModel 实现单元测试感到困惑。我正在使用 Retrofit 来获取 API 并使用存储库。 ViewModel.kt @HiltViewModel 类 MoviesViewModel @Inject

回答 3 投票 0

在Retrofit android中解析JSON?

我正在尝试在android上使用Retrofit解析以下JSON结构。 { “有效负载”:[ { “名称”:“米饭”, “品牌”:[ { “名字”:“达瓦特”...

回答 3 投票 0

通过 PUT 方法发送枚举,Retrofit |错误 400

我想通过Retrofit将枚举类发送到API。为了解析我使用 Gson。 我发送的枚举类: 枚举类任务状态{ 未分配, 进行中, 关闭, 已删除} 我的改造方法: @PUT(&

回答 1 投票 0

无法在RecyclerView中显示所有给定数据

我正在尝试在 RecyclerView 中显示来自预测 api 的数据。问题是,我不断地只显示一条数据——来自 api 的第一个数据,但应该还有更多。我是...

回答 3 投票 0

我可以向一个 Retrofit 实例添加多少个 Retrofit 拦截器?

我的面试问题之一是: 我可以向 Retrofit 实例添加的拦截器的最大数量是多少? 我花了一分钟思考,如果我要创建这样一个库,为什么我要限制 n...

回答 1 投票 0

如何通过自定义反序列化解析Json数据

我正在发送 API 调用并得到这样的响应 {“12312412312124123124”:{“id”:“12312412312124123124”,“内容”:[{“id”:41419969}]}, &...

回答 3 投票 0

okHttp 客户端在添加 callTimeout() 配置后超时,并且有时请求无法到达主机

将 callTimeout() 配置添加到 okhttp 客户端后,我开始超时 引起原因:java.io.InterruptedIOException:超时 引起原因:java.io.IOException:已取消 OkHttpClient httpClient...

回答 3 投票 0

如何在Retrofit(Kotlin)中获取响应状态?

我正在使用Retrofit。使用科特林。我需要知道响应状态代码。比如是 200 还是 500。我如何从响应中获取它? 我的 API 类: 接口 API { @POST(“用户/代码/检查”)...

回答 3 投票 0

将纯文本作为 POST 正文发送会导致改造出现问题

我正在向我的后端发出 POST 请求,但仅使用改造时我收到 400。 我深入研究了这个问题并意识到,因为我的 POST 正文是一个普通字符串(而不是 JSON),每当我有双引号时......

回答 3 投票 0

使用 JsonReader.setLenient(true) 接受格式错误的 JSON

当我尝试通过改造将数据添加到数据库时,出现此错误,但我不知道为什么。 错误: 使用 JsonReader.setLenient(true) 接受第 1 行第 1 列路径 $ 处格式错误的 JSON 服务:

回答 1 投票 0

Android Kotlin MVVM架构中无法解析Json数据

我正在创建一个应用程序,在其中调用rest api并将所有数据存储在SQLite Room数据库中,然后我从Room数据库检索该数据并显示在RecycleView中 下面我...

回答 1 投票 0

MockWebServer 响应延迟 - 测试超时

我正在尝试使用 MockWebServer 测试 HTTP 超时场景,该服务器响应使用 Retrofit/OkHttp 发送的测试请求。 (这个问题几年前就被问过,但当时涉及...

回答 4 投票 0

如何使用拦截器flutter处理标头中的令牌保存?

有一个使用 Injectable 包进行依赖注入的 Dart 项目。我面临三个类之间的循环依赖问题:TokenInterceptor、AuthRepository 和 ApiDatasource,这...

回答 1 投票 0

Retrofit 不支持 CLEARTEXT 通信

我正在尝试使用 Retrofit 连接到 Android 上的 https 服务器。这是我的 OkHttpClient @提供 公共 OkHttpClient 提供ContactClient(){ HttpLoggingInterceptor 拦截器 = 新

回答 6 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.