笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

请求方式--retrofit2 笔记

Posted on 2024-06-13 16:06  草妖  阅读(11)  评论(0)    收藏  举报

更加详细内容请查看:

  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;
    }