我正在尝试从代码进行PUT请求调用。我使用了如下所示的WebResource Class对象:
final Client client = Client.create();
final WebResource webResource = client.resource(API_URL);
client.setConnectTimeout(Integer.valueOf(connectionTimeout));
client.setReadTimeout(Integer.valueOf(readTimeout));
client.addFilter(new HTTPBasicAuthFilter(apiUsername, apiPassword));
webResource.type(MediaType.APPLICATION_JSON);
webResource.accept(MediaType.APPLICATION_JSON);
webResource.header("Content-Length",
String.valueOf(jsonInString.getBytes(Charset.forName("UTF-8")).length));
final ClientResponse response = webResource.put(ClientResponse.class,
jsonInString);
这里所有的变量连接超时,读取超时,api用户名,apiPassword API_URL都有正确的值。
从最后一行开始,它正在拖曳一个套接字异常 com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Connection reset 异常在 ClientHandlerException catch 块中捕获。
但是当我试图用邮递员休息客户端的其他输入来击中API_URL时,我得到了成功的响应。
任何人都可以帮助我理解为什么它不能从代码中工作吗?
使用 JRE 7 作为运行时环境。并像下面这样创建您的客户端并使用。它将解决您的问题。
package com.myoffice.util;
import java.security.SecureRandom;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.DefaultClientConfig;
public class ClientHelper {
enter code here
private static Client client = null;
static{
SSLContext ctx = null;
try {
//Protocol used is TLSv1.2. You may need other ..check target URL required Protocol
ctx = SSLContext.getInstance("TLSv1.2"));
ctx.init(null, null, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
client= Client.create(new DefaultClientConfig());
} catch (Exception e) {
logger.error("Exception while creating SSLContext", e);
}
}
public static Client getClient(){
return client;
}
}