更加详细内容请查看:
Retrofit学习之文件和参数上传 - 简书 (jianshu.com)
你真的会用Retrofit2吗?Retrofit2完全教程 - Honnnnl - 博客园 (cnblogs.com),
官网:Retrofit (square.github.io)
以下仅作笔记处理:
*\JFXTools\pom.xml
<!-- retrofit2请求(客户端请求API)依赖 -->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 示例使用jackson的converter -->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-jackson</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 注:在Java22中会报"java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature"错误,添加fasterxml即可 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
*\JFXTools\src\main\java\base\RetrofitService.java
package Service; import bean.RiZhiModel; import okhttp3.MultipartBody; import retrofit2.Call; import retrofit2.http.*; /** 处理retrofit2请求接口 **/ public interface RetrofitService { @GET("api/Public/GetServerTime") Call<Object> getServerTime(); /** Get请求传递参数 */ @GET("api/Public/GetServerTime") Call<Object> getServerTime(@Query("id") int id); /** post请求传递参数 */ @POST("api/Public/GetServerTime") Call<Object> getServerTime(@Body RiZhiModel model); /** 使用HTTP可以替代GET/POST/PUT/DELETE等请求方式,不过需要指定其类型 * method 表示请求的方法,区分大小写 * path表示路径 * hasBody表示是否有请求体 * */ @HTTP(method = "GET", path = "api/Public/GetServerTime/{id}/user", hasBody = false) Call<Object> getServerTime(@Path("id") String id); /** 上传文件案例 * @FormUrlEncoded相当于指定一个From表单请求,就是Content-Type:application/x-www-form-urlencoded * @Multipart则表示使用Content-Type为“multipart/form-data” * */ @Multipart @POST("api/Public/uploadFile") Call<Object> uploadFile(@Body RiZhiModel model,@Part MultipartBody.Part files); /** @Headers/@Header表示添加请求头处理 * */ @GET("api/Public/GetServerTime1") @Headers({"CustomHeader1: customHeaderValue1", "CustomHeader2: customHeaderValue2"}) Call<Object> getServerTime1(@Header("CustomHeader3") String customHeaderValue3); /** @Url表示指定执行的URL后缀,@Query表示指定的执行条件 * 对于:http://172.16.41.221:10101/web_fscmodule/api/Public/GetServerTime2?queryStr=1 * @Url相当于:api/Public/GetServerTime2 * @Query相当于:queryStr=1。 * 注:上述调用getServerTime2实际填写如下:getServerTime2("api/Public/GetServerTime2",1) * **/ @GET("api/Public/GetServerTime2") Call<Object> getServerTime2(@Url String url, @Query("queryStr") String queryStr); }
*\JFXTools\src\main\java\bean\RiZhiModel.java
package bean; import org.joda.time.DateTime; /* * 日志模型 * */ public class RiZhiModel {// 打印时间 public String printTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); // 错误信息 public String errMsg; }
*\JFXTools\src\main\java\base\RunRetrofit2Interceptor.java
package base; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import org.jetbrains.annotations.NotNull; import org.joda.time.DateTime; import java.io.IOException; /** 模拟拦截器功能,本案例模拟的是在请求头添加数据 */ public class RunRetrofit2Interceptor implements Interceptor { @NotNull @Override public Response intercept(@NotNull Chain chain) throws IOException { Request request = chain.request(); Request.Builder builder = request.newBuilder(); builder.addHeader("sign", String.valueOf(DateTime.now().getMillis())); request = builder.build(); return chain.proceed(request); } }
*\JFXTools\src\main\java\Controllers.java
/** retrofit2案例 */ public void runRetrofit2Demo(){ new Thread(()->{ try{ // 定义OkHttpClient OkHttpClient tempOkHttpClient=new OkHttpClient().newBuilder() // 设置超时时间 .connectTimeout(3,TimeUnit.SECONDS) // 设置读取超时时间 .readTimeout(3,TimeUnit.SECONDS) // 添加拦截器 .addInterceptor(new RunRetrofit2Interceptor()) .build(); // 定义Retrofit Retrofit retrofit = new Retrofit.Builder() // 注:baseUrl必须以"/"结尾,否则将会报错 .baseUrl("http://172.16.41.221:10101/web_fscmodule/") // 与OkHttpClient搭配使用 .client(tempOkHttpClient) // addConverterFactory支持GsonConverter和JacksonConverter两种方式,本例子使用的是JacksonConverter .addConverterFactory(JacksonConverterFactory.create()) .build(); RetrofitService retrofitService = retrofit.create(RetrofitService.class); Call<Object> call = retrofitService.getServerTime(); // 同步处理 try { Object result = call.execute().body(); System.out.println(result); } catch (IOException e) { e.printStackTrace(); } // 异步处理 call.enqueue(new Callback<Object>() { @Override public void onResponse(Call<Object> call, Response<Object> response) { System.out.println("执行是否成功:"+response.isSuccessful()); Object result = response.body(); System.out.println(result); } @Override public void onFailure(Call<Object> call, Throwable throwable) { // 执行失败处理 } }); /** 文件上传 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://172.16.41.221:10101/web_fscmodule/") .addConverterFactory(JacksonConverterFactory.create()) .build(); RetrofitService retrofitService = retrofit.create(RetrofitService.class); // 参数信息 RiZhiModel tempRiZhiInfo=new RiZhiModel(); tempRiZhiInfo.errMsg="具体参数内容"; ** 可以使用这种方式上传 * MediaType textType = MediaType.parse("text/plain"); * RequestBody errMsg = RequestBody.create(textType, "具体参数内容"); * * // 上传文件信息 RequestBody file = RequestBody.create(MediaType.parse("application/octet-stream"), "这里是模拟文件的内容"); MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", "test.txt", file); Call<Object> call = retrofitService.uploadFile(tempRiZhiInfo,filePart); try { Object result = call.execute().body(); System.out.println(result); } catch (IOException e) { e.printStackTrace(); } */ }catch (Exception err){ System.out.println(Thread.currentThread().getName()+",执行Runnable异常:"+err.getMessage()); } },"runRetrofit2DemoThread").start(); }
输出:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:16763,suspend=y,server=n -javaagent:C:\Users\namejr\AppData\Local\JetBrains\IntelliJIdea2023.2\captureAgent\debugger-agent.jar=file:/C:/Users/namejr/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;C:\Users\namejr\JavaCode\JFXTools\target\classes;C:\Users\namejr\.m2\repository\mysql\mysql-connector-java\8.0.30\mysql-connector-java-8.0.30.jar;C:\Users\namejr\.m2\repository\com\google\protobuf\protobuf-java\3.19.4\protobuf-java-3.19.4.jar;C:\Users\namejr\.m2\repository\com\alibaba\fastjson\2.0.11\fastjson-2.0.11.jar;C:\Users\namejr\.m2\repository\com\alibaba\fastjson2\fastjson2-extension\2.0.11\fastjson2-extension-2.0.11.jar;C:\Users\namejr\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.11\fastjson2-2.0.11.jar;C:\Users\namejr\.m2\repository\com\google\zxing\core\3.5.1\core-3.5.1.jar;C:\Users\namejr\.m2\repository\com\google\zxing\javase\3.5.1\javase-3.5.1.jar;C:\Users\namejr\.m2\repository\com\beust\jcommander\1.82\jcommander-1.82.jar;C:\Users\namejr\.m2\repository\com\github\jai-imageio\jai-imageio-core\1.4.0\jai-imageio-core-1.4.0.jar;C:\Users\namejr\.m2\repository\redis\clients\jedis\4.2.3\jedis-4.2.3.jar;C:\Users\namejr\.m2\repository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\Users\namejr\.m2\repository\org\json\json\20211205\json-20211205.jar;C:\Users\namejr\.m2\repository\com\google\code\gson\gson\2.8.9\gson-2.8.9.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-api\4.9.1\selenium-api-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-chrome-driver\4.9.1\selenium-chrome-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\com\google\auto\service\auto-service-annotations\1.0.1\auto-service-annotations-1.0.1.jar;C:\Users\namejr\.m2\repository\com\google\auto\service\auto-service\1.0.1\auto-service-1.0.1.jar;C:\Users\namejr\.m2\repository\com\google\auto\auto-common\1.2\auto-common-1.2.jar;C:\Users\namejr\.m2\repository\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;C:\Users\namejr\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\namejr\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\namejr\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\namejr\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\namejr\.m2\repository\com\google\errorprone\error_prone_annotations\2.11.0\error_prone_annotations-2.11.0.jar;C:\Users\namejr\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-chromium-driver\4.9.1\selenium-chromium-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-json\4.9.1\selenium-json-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-manager\4.9.1\selenium-manager-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-remote-driver\4.9.1\selenium-remote-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\io\netty\netty-buffer\4.1.91.Final\netty-buffer-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-codec-http\4.1.91.Final\netty-codec-http-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-codec\4.1.91.Final\netty-codec-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-handler\4.1.91.Final\netty-handler-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-common\4.1.91.Final\netty-common-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-classes-epoll\4.1.91.Final\netty-transport-classes-epoll-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-classes-kqueue\4.1.91.Final\netty-transport-classes-kqueue-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-native-epoll\4.1.91.Final\netty-transport-native-epoll-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-native-kqueue\4.1.91.Final\netty-transport-native-kqueue-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-native-unix-common\4.1.91.Final\netty-transport-native-unix-common-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport\4.1.91.Final\netty-transport-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-resolver\4.1.91.Final\netty-resolver-4.1.91.Final.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-api\1.25.0\opentelemetry-api-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-context\1.25.0\opentelemetry-context-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-exporter-logging\1.25.0\opentelemetry-exporter-logging-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-metrics\1.25.0\opentelemetry-sdk-metrics-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-logs\1.25.0-alpha\opentelemetry-sdk-logs-1.25.0-alpha.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-api-logs\1.25.0-alpha\opentelemetry-api-logs-1.25.0-alpha.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-api-events\1.25.0-alpha\opentelemetry-api-events-1.25.0-alpha.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-common\1.25.0\opentelemetry-sdk-common-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-extension-autoconfigure-spi\1.25.0\opentelemetry-sdk-extension-autoconfigure-spi-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-extension-autoconfigure\1.25.0-alpha\opentelemetry-sdk-extension-autoconfigure-1.25.0-alpha.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk-trace\1.25.0\opentelemetry-sdk-trace-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-sdk\1.25.0\opentelemetry-sdk-1.25.0.jar;C:\Users\namejr\.m2\repository\io\opentelemetry\opentelemetry-semconv\1.25.0-alpha\opentelemetry-semconv-1.25.0-alpha.jar;C:\Users\namejr\.m2\repository\io\ous\jtoml\2.0.0\jtoml-2.0.0.jar;C:\Users\namejr\.m2\repository\net\bytebuddy\byte-buddy\1.14.4\byte-buddy-1.14.4.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-exec\1.3\commons-exec-1.3.jar;C:\Users\namejr\.m2\repository\org\asynchttpclient\async-http-client\2.12.3\async-http-client-2.12.3.jar;C:\Users\namejr\.m2\repository\org\asynchttpclient\async-http-client-netty-utils\2.12.3\async-http-client-netty-utils-2.12.3.jar;C:\Users\namejr\.m2\repository\io\netty\netty-codec-socks\4.1.60.Final\netty-codec-socks-4.1.60.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-handler-proxy\4.1.60.Final\netty-handler-proxy-4.1.60.Final.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-native-epoll\4.1.60.Final\netty-transport-native-epoll-4.1.60.Final-linux-x86_64.jar;C:\Users\namejr\.m2\repository\io\netty\netty-transport-native-kqueue\4.1.60.Final\netty-transport-native-kqueue-4.1.60.Final-osx-x86_64.jar;C:\Users\namejr\.m2\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;C:\Users\namejr\.m2\repository\com\typesafe\netty\netty-reactive-streams\2.0.4\netty-reactive-streams-2.0.4.jar;C:\Users\namejr\.m2\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-firefox-driver\4.9.1\selenium-firefox-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-devtools-v85\4.9.1\selenium-devtools-v85-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-http\4.9.1\selenium-http-4.9.1.jar;C:\Users\namejr\.m2\repository\dev\failsafe\failsafe\3.3.1\failsafe-3.3.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-ie-driver\4.9.1\selenium-ie-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-java\4.9.1\selenium-java-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-devtools-v111\4.9.1\selenium-devtools-v111-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-devtools-v112\4.9.1\selenium-devtools-v112-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-devtools-v113\4.9.1\selenium-devtools-v113-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-edge-driver\4.9.1\selenium-edge-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-safari-driver\4.9.1\selenium-safari-driver-4.9.1.jar;C:\Users\namejr\.m2\repository\org\seleniumhq\selenium\selenium-support\4.9.1\selenium-support-4.9.1.jar;C:\Users\namejr\.m2\repository\joda-time\joda-time\2.10.14\joda-time-2.10.14.jar;C:\Users\namejr\.m2\repository\org\java-websocket\Java-WebSocket\1.5.3\Java-WebSocket-1.5.3.jar;C:\Users\namejr\.m2\repository\net\lingala\zip4j\zip4j\2.10.0\zip4j-2.10.0.jar;C:\Users\namejr\.m2\repository\net\sf\sevenzipjbinding\sevenzipjbinding\16.02-2.01\sevenzipjbinding-16.02-2.01.jar;C:\Users\namejr\.m2\repository\net\sf\sevenzipjbinding\sevenzipjbinding-all-platforms\16.02-2.01\sevenzipjbinding-all-platforms-16.02-2.01.jar;C:\Users\namejr\.m2\repository\org\tukaani\xz\1.9\xz-1.9.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\namejr\.m2\repository\fr\opensagres\xdocreport\xdocreport\1.0.6\xdocreport-1.0.6.jar;C:\Users\namejr\.m2\repository\com\huaweicloud\esdk-obs-java\3.24.3\esdk-obs-java-3.24.3.jar;C:\Users\namejr\.m2\repository\com\squareup\okhttp3\okhttp\4.12.0\okhttp-4.12.0.jar;C:\Users\namejr\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk8\1.8.21\kotlin-stdlib-jdk8-1.8.21.jar;C:\Users\namejr\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib\1.8.21\kotlin-stdlib-1.8.21.jar;C:\Users\namejr\.m2\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;C:\Users\namejr\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-jdk7\1.8.21\kotlin-stdlib-jdk7-1.8.21.jar;C:\Users\namejr\.m2\repository\com\squareup\okio\okio\3.6.0\okio-3.6.0.jar;C:\Users\namejr\.m2\repository\com\squareup\okio\okio-jvm\3.6.0\okio-jvm-3.6.0.jar;C:\Users\namejr\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.9.10\kotlin-stdlib-common-1.9.10.jar;C:\Users\namejr\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.15.2\jackson-core-2.15.2.jar;C:\Users\namejr\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.15.2\jackson-databind-2.15.2.jar;C:\Users\namejr\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.15.2\jackson-annotations-2.15.2.jar;C:\Users\namejr\.m2\repository\org\apache\logging\log4j\log4j-core\2.18.0\log4j-core-2.18.0.jar;C:\Users\namejr\.m2\repository\org\apache\logging\log4j\log4j-api\2.18.0\log4j-api-2.18.0.jar;C:\Users\namejr\.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\namejr\.m2\repository\org\jgroups\jgroups\4.2.6.Final\jgroups-4.2.6.Final.jar;C:\Users\namejr\.m2\repository\org\dom4j\dom4j\2.1.4\dom4j-2.1.4.jar;C:\Users\namejr\.m2\repository\org\apache\poi\poi\5.2.3\poi-5.2.3.jar;C:\Users\namejr\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;C:\Users\namejr\.m2\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;C:\Users\namejr\.m2\repository\com\zaxxer\SparseBitSet\1.2\SparseBitSet-1.2.jar;C:\Users\namejr\.m2\repository\org\apache\poi\poi-ooxml\5.2.3\poi-ooxml-5.2.3.jar;C:\Users\namejr\.m2\repository\org\apache\poi\poi-ooxml-lite\5.2.3\poi-ooxml-lite-5.2.3.jar;C:\Users\namejr\.m2\repository\org\apache\xmlbeans\xmlbeans\5.1.1\xmlbeans-5.1.1.jar;C:\Users\namejr\.m2\repository\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar;C:\Users\namejr\.m2\repository\com\github\virtuald\curvesapi\1.07\curvesapi-1.07.jar;C:\Users\namejr\.m2\repository\cn\hutool\hutool-core\5.8.9\hutool-core-5.8.9.jar;C:\Users\namejr\.m2\repository\net\sf\cssbox\cssbox\5.0.1\cssbox-5.0.1.jar;C:\Users\namejr\.m2\repository\org\codelibs\nekohtml\2.0.2\nekohtml-2.0.2.jar;C:\Users\namejr\.m2\repository\org\codelibs\xerces\xercesImpl\2.12.0-sp1\xercesImpl-2.12.0-sp1.jar;C:\Users\namejr\.m2\repository\net\sf\cssbox\jstyleparser\4.0.0\jstyleparser-4.0.0.jar;C:\Users\namejr\.m2\repository\org\antlr\antlr4-runtime\4.5.3\antlr4-runtime-4.5.3.jar;C:\Users\namejr\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\namejr\.m2\repository\com\squareup\retrofit2\retrofit\2.11.0\retrofit-2.11.0.jar;C:\Users\namejr\.m2\repository\com\squareup\retrofit2\converter-jackson\2.11.0\converter-jackson-2.11.0.jar;C:\Users\namejr\JavaCode\JFXTools\libs\jave-1.0.2.jar;C:\Users\namejr\JavaCode\JFXTools\libs\LoggingPlugIn.jar;C:\Users\namejr\JavaCode\JFXTools\libs\amqp-client-5.17.0.jar;C:\Users\namejr\idea\IntelliJ IDEA 2023.2.2\lib\idea_rt.jar" JFXToolMain 已连接到地址为 ''127.0.0.1:16763',传输: '套接字'' 的目标虚拟机 {Data=2024-06-13 16:24:51, Status=1, StatusDescription=获取数据成功, DataCount={TotalCount=1}} 已与地址为 ''127.0.0.1:16763',传输: '套接字'' 的目标虚拟机断开连接 进程已结束,退出代码为 -1
请求案例记录:
客户端:
MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder(); multipartBodyBuilder.setType(MultipartBody.FORM); multipartBodyBuilder.addFormDataPart("title", title); multipartBodyBuilder.addFormDataPart("content", content); multipartBodyBuilder.addFormDataPart("uid", ClientRunUtil.userInfo.userName); for(String fileInfo:fileInfos){ File tempFileHandel=new File(fileInfo); if(tempFileHandel.exists()){ multipartBodyBuilder.addFormDataPart("uploadFile", tempFileHandel.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), tempFileHandel)); } } RequestBody requestBody = multipartBodyBuilder.build(); String tempBasePathUrl= ClientRunUtil.prevAddr+(ClientRunUtil.prevAddr.endsWith("/")?"Web_ClothSystem/":"/Web_ClothSystem/"); if(testButtonStatus==1){ tempBasePathUrl= "http://127.0.0.1:8081/"; } // 定义OkHttpClient OkHttpClient tempOkHttpClient=new OkHttpClient().newBuilder().connectTimeout(30, TimeUnit.SECONDS).readTimeout(30,TimeUnit.SECONDS).build(); // 定义Retrofit Retrofit retrofit = new Retrofit.Builder().baseUrl(tempBasePathUrl).client(tempOkHttpClient).addConverterFactory(JacksonConverterFactory.create()).build(); WebClothSysService retrofitService = retrofit.create(WebClothSysService.class); Call<Object> call = retrofitService.uploadFeedBackFiles(requestBody); // 同步处理 String tempBackInfo = JSON.toJSONString(call.execute().body()); if(StringUtils.isNotBlank(tempBackInfo)){ ApiResponse<Boolean> tempBackSecCodeInfos=JSONObject.parseObject(tempBackInfo, new TypeReference<>() {}); if(tempBackSecCodeInfos!=null){ return tempBackSecCodeInfos.data; } }
package com.namejr.service; import okhttp3.RequestBody; import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Query; public interface WebClothSysService { @GET("api/Config/getDBConfig") Call<Object> getDBConfig(@Query("uName") String uName); @POST("api/Public/uploadFeedBackFiles") Call<Object> uploadFeedBackFiles(@Body RequestBody parts); }
服务端:
@RequestMapping(value = "/uploadFeedBackFiles", method = RequestMethod.POST,produces = "application/json;charset=UTF-8") @Operation(summary = "上传文件") @Parameters({@Parameter(in = ParameterIn.HEADER, description = "上传名称", name = "userName")}) public ApiResponse<Boolean> uploadFeedBackFiles(HttpServletRequest req, @RequestParam("uploadFile") MultipartFile[] uploadFiles) { ApiResponse<Boolean> _data = new ApiResponse<>(); try { String title = req.getParameter("title"); String content = req.getParameter("content"); String uid = req.getParameter("uid"); _data.data = pServiceImpl.uploadFeedBackFiles(title,content,uid,uploadFiles); _data.status=_data.data?1:0; _data.statusDescription = "上传文件成功"; _data.totalCount=1; } catch (Exception err) { _data.status=-1; _data.data=false; _data.statusDescription=err.getMessage(); _data.totalCount=0; logServiceImpl.writeLogInfos(Thread.currentThread().getStackTrace()[1].getMethodName(), err); } return _data; }
public boolean uploadFeedBackFiles(String title,String content,String uname,MultipartFile[] uploadFiles) throws Exception{ List<String> tempBackPathUrls=new ArrayList<>(); for(MultipartFile uploadFile:uploadFiles){ String tempBackPathUrl=dealSaveFilesInfos(uploadFile); if(StringUtils.isNotBlank(tempBackPathUrl)){ tempBackPathUrls.add(tempBackPathUrl); } } logServiceImpl.writeLogInfos(Thread.currentThread().getStackTrace()[1].getMethodName(), new Exception("title:"+title+",content:"+content+",uname:"+uname+",tempBackPathUrls:"+ JSON.toJSONString(tempBackPathUrls))); return true; } /* * 保存上传文件 * */ private String dealSaveFilesInfos(MultipartFile uploadFile) throws Exception { String oldName = uploadFile.getOriginalFilename(); String tempFileType = null; if (oldName != null) { tempFileType = oldName.substring(oldName.lastIndexOf(".")); } List<String> uploadPathTypes = Arrays.asList(uploadPathType.split("\\|", -1)); if (!uploadPathTypes.contains(tempFileType)) { throw new Exception("上传文件类型不对"); } String uploadParentPath = ResourceUtils.getURL("classpath:").getPath(); uploadParentPath+="META-INF/resources/"; File folder = new File(uploadParentPath + uploadPath); if (!folder.isDirectory()) { folder.mkdirs(); } // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String newName = DateTime.now().toString("yyyy_MM_dd_HH_mm_ss") + tempFileType; uploadFile.transferTo(new File(folder, newName)); return uploadPath + "/" + newName; }