Java 改装2-SSLException而不是413
我正在尝试向Java 改装2-SSLException而不是413,java,android,nginx,retrofit2,http-status-code-413,Java,Android,Nginx,Retrofit2,Http Status Code 413,我正在尝试向NGinx/1.10.2服务器发送一个文件(230MB) 服务器配置为处理最大200MB的数据 我发送的文件如下: @Multipart @POST("api/test") Completable test( @PartMap Map<String, RequestBody> params, @Part MultipartBody.Part file ); 现在我期望413状态代码出现错误。不幸的是,我收到: <-- HTTP FA
NGinx/1.10.2
服务器发送一个文件(230MB)
服务器配置为处理最大200MB的数据
我发送的文件如下:
@Multipart
@POST("api/test")
Completable test(
@PartMap Map<String, RequestBody> params,
@Part MultipartBody.Part file
);
现在我期望413状态代码出现错误。不幸的是,我收到:
<-- HTTP FAILED: javax.net.ssl.SSLException: Write error: ssl=0x76c8f32400: I/O error during system call, Connection reset by peer
请求部分:
public Completable test(File file) {
Map<String, RequestBody> map = getInfo();
RequestBody body = RequestBody.create(MediaType.parse(getMimeType(file.toString())), file);
MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), body);
return retrofit.create(Api.class)
.flatMapCompletable(api -> api.test(map, fileToUpload));
}
公共可完成测试(文件){
Map=getInfo();
RequestBody=RequestBody.create(MediaType.parse(getMimeType(file.toString())),file);
MultipartBody.Part fileToUpload=MultipartBody.Part.createFormData(“文件”,file.getName(),body);
返回改装。创建(Api.class)
.flatMapCompletable(api->api.test(map,fileToUpload));
}
这应该起作用:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(YOUR_HTTPS_URL)
.setClient(getUnsafeOkHttpClient())
.build();
显示代码的RequestBody部分,也可以试试这个。好。。。谢谢你的回复,但是。。。几件事:1)
sslSocketFactory
方法已被弃用;2) 相信一切通常是个坏主意;3) 即使我尝试了你的解决方案,也无济于事。
public Completable test(File file) {
Map<String, RequestBody> map = getInfo();
RequestBody body = RequestBody.create(MediaType.parse(getMimeType(file.toString())), file);
MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), body);
return retrofit.create(Api.class)
.flatMapCompletable(api -> api.test(map, fileToUpload));
}
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[0];
}
} };
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts,
new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext
.getSocketFactory();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient = okHttpClient.newBuilder()
.sslSocketFactory(sslSocketFactory)
.hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(YOUR_HTTPS_URL)
.setClient(getUnsafeOkHttpClient())
.build();