HttpClient,okhttp,RestTemplate 의 차이 점 에 대해 말씀 드 리 겠 습 니 다.
15911 단어 HttpClientokhttpRestTemplate
1.pom 의존
<!--HttpClient-->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
2.HttpClient 코드 구현
public class HttpClientUtil {
/**
* httpClient get
* GetMethod URL :
* 1. HttpClient ;
* 2. GetMethod ;
* 3. HttpClient GetMethod Get ;
* 4. ;
* 5. , HTTP ;
* 6. 。
* @param url
* @param charset
* @return
*/
public static String doGet(String url, String charset) {
//1. HttpClient
HttpClient httpClient = new HttpClient();
// Http 5
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
//2. GetMethod
GetMethod getMethod = new GetMethod(url);
// get 5
getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
// , :
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
String response = "";
//3. HTTP GET
try {
int statusCode = httpClient.executeMethod(getMethod);
//4.
if (statusCode != HttpStatus.SC_OK) {
System.err.println(" :" + getMethod.getStatusLine());
}
//5. HTTP
//HTTP ,
Header[] headers = getMethod.getResponseHeaders();
for(Header h : headers) {
System.out.println(h.getName() + "---------------" + h.getValue());
}
// HTTP ,
//
byte[] responseBody = getMethod.getResponseBody();
response = new String(responseBody, charset);
System.out.println("-----------response:" + response);
// InputStream,
//InputStream response = getMethod.getResponseBodyAsStream();
} catch (HttpException e) {
// ,
System.out.println(" URL!");
e.printStackTrace();
} catch (IOException e) {
//
System.out.println(" !");
} finally {
//6.
getMethod.releaseConnection();
}
return response;
}
/**
* post
* @param url
* @param json
* @return
*/
public static String doPost(String url, JSONObject json){
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("accept", "*/*");
postMethod.addRequestHeader("connection", "Keep-Alive");
// json
postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK");
// Header
postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
//
postMethod.addParameter("commentId", json.getString("commentId"));
String res = "";
try {
int code = httpClient.executeMethod(postMethod);
if (code == 200){
res = postMethod.getResponseBodyAsString();
System.out.println(res);
}
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
public static void main(String[] args) {
System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "GBK"));
System.out.println("----------- ------------");
System.out.println("----------- ------------");
System.out.println("----------- ------------");
JSONObject jsonObject = new JSONObject();
jsonObject.put("commentId", "13026194071");
System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject));
}
}
3.제안코드 가 복잡 하고 자원 회수 에 도 신경 을 써 야 한다.코드 가 복잡 하고 불필요 한 코드 가 많아 서 직접 사용 하 는 것 을 권장 하지 않 습 니 다.
okhttp
1.소개
OkHttp 는 효율 적 인 HTTP 클 라 이언 트 로 같은 호스트 주소 의 모든 요청 이 같은 socket 연결 을 공유 할 수 있 도록 합 니 다.연결 탱크 감소 요청 지연;투명 한 GZIP 압축 으로 응답 데이터 의 크기 감소;캐 시 응답 내용 으로 완전히 중복 되 는 요청 을 피하 십시오.
네트워크 에 문제 가 생 겼 을 때 OkHttp 는 여전히 자신의 역할 을 지 키 며 일반적인 연결 문 제 를 자동 으로 복구 합 니 다.서비스 에 여러 개의 IP 주소 가 있 으 면 첫 번 째 IP 요청 이 실 패 했 을 때 OkHttp 는 설정 한 다른 IP 를 교체 하고 OkHttp 는 현대 TLS 기술(SNI,ALPN)을 사용 하여 새로운 연결 을 초기 화 합 니 다.악수 에 실 패 했 을 때 TLS 1.0 으로 되 돌아 갑 니 다.
2.pom 의존
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
요청/응답 API 는 구조 기 모드 builders 를 사용 하여 설계 되 었 습 니 다.차단 식 동기 화 요청 과 반전 이 있 는 비동기 요청 을 지원 합 니 다.3.프로필
@Configuration
public class OkHttpConfig {
@Bean
public OkHttpClient okHttpClient() {
return new OkHttpClient.Builder()
//.sslSocketFactory(sslSocketFactory(), x509TrustManager())
.retryOnConnectionFailure(false)
.connectionPool(pool())
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30,TimeUnit.SECONDS)
.build();
}
@Bean
public X509TrustManager x509TrustManager() {
return new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
}
@Bean
public SSLSocketFactory sslSocketFactory() {
try {
//
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return null;
}
/**
* Create a new connection pool with tuning parameters appropriate for a single-user application.
* The tuning parameters in this pool are subject to change in future OkHttp releases. Currently
*/
@Bean
public ConnectionPool pool() {
return new ConnectionPool(200, 5, TimeUnit.MINUTES);
}
}
4.클 라 이언 트 도구
@Slf4j
public class OkHttpClient {
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private volatile static okhttp3.OkHttpClient client;
private static final int MAX_IDLE_CONNECTION = Integer
.parseInt(ConfigManager.get("httpclient.max_idle_connection"));
private static final long KEEP_ALIVE_DURATION = Long
.parseLong(ConfigManager.get("httpclient.keep_alive_duration"));
private static final long CONNECT_TIMEOUT = Long.parseLong(ConfigManager.get("httpclient.connectTimeout"));
private static final long READ_TIMEOUT = Long.parseLong(ConfigManager.get("httpclient. "));
/**
* ( )
*
* @return client
*/
private static okhttp3.OkHttpClient getInstance() {
if (client == null) {
synchronized (okhttp3.OkHttpClient.class) {
if (client == null) {
client = new okhttp3.OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(MAX_IDLE_CONNECTION, KEEP_ALIVE_DURATION,
TimeUnit.MINUTES))
.build();
}
}
}
return client;
}
public static String syncPost(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try {
Response response = OkHttpClient.getInstance().newCall(request).execute();
if (response.isSuccessful()) {
String result = response.body().string();
log.info("syncPost response = {}, responseBody= {}", response, result);
return result;
}
String result = response.body().string();
log.info("syncPost response = {}, responseBody= {}", response, result);
throw new IOException(" http " + response.code());
} catch (Exception e) {
log.error("syncPost() url:{} have a ecxeption {}", url, e);
throw new RuntimeException("syncPost() have a ecxeption {}" + e.getMessage());
}
}
public static String syncGet(String url, Map<String, Object> headParamsMap) throws IOException {
Request request;
final Request.Builder builder = new Request.Builder().url(url);
try {
if (!CollectionUtils.isEmpty(headParamsMap)) {
final Iterator<Map.Entry<String, Object>> iterator = headParamsMap.entrySet()
.iterator();
while (iterator.hasNext()) {
final Map.Entry<String, Object> entry = iterator.next();
builder.addHeader(entry.getKey(), (String) entry.getValue());
}
}
request = builder.build();
Response response = OkHttpClient.getInstance().newCall(request).execute();
String result = response.body().string();
log.info("syncGet response = {},responseBody= {}", response, result);
if (!response.isSuccessful()) {
throw new IOException(" http " + response.code());
}
return result;
} catch (Exception e) {
log.error("remote interface url:{} have a ecxeption {}", url, e);
throw new RuntimeException(" ");
}
}
}
3.RestTemplate1.pom 의존
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.get 요청(참여 하지 않 은 즉시 매개 변 수 를 취소 하면 됩 니 다)
// 1-getForObject()
User user1 = this.restTemplate.getForObject(uri, User.class);
// 2-getForEntity()
ResponseEntity<User> responseEntity1 = this.restTemplate.getForEntity(uri, User.class);
HttpStatus statusCode = responseEntity1.getStatusCode();
HttpHeaders header = responseEntity1.getHeaders();
User user2 = responseEntity1.getBody();
// 3-exchange()
RequestEntity requestEntity = RequestEntity.get(new URI(uri)).build();
ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);
User user3 = responseEntity2.getBody();
방식 1:
Notice notice = restTemplate.getForObject("http://fantj.top/notice/list/{1}/{2}"
, Notice.class,1,5);
방식 2:
Map<String,String> map = new HashMap();
map.put("start","1");
map.put("page","5");
Notice notice = restTemplate.getForObject("http://fantj.top/notice/list/"
, Notice.class,map);
3.post 요청
// 1-postForObject()
User user1 = this.restTemplate.postForObject(uri, user, User.class);
// 2-postForEntity()
ResponseEntity<User> responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class);
// 3-exchange()
RequestEntity<User> requestEntity = RequestEntity.post(new URI(uri)).body(user);
ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);
방식 1:
String url = "http://demo/api/book/";
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
String requestJson = "{...}";
HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String result = restTemplate.postForObject(url, entity, String.class);
System.out.println(result);
방식 2:
@Test
public void rtPostObject(){
RestTemplate restTemplate = new RestTemplate();
String url = "http://47.xxx.xxx.96/register/checkEmail";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add("email", "[email protected]");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
System.out.println(response.getBody());
}
RestTemplate 사용 시 주의:RestTemplate 를 사용 하여 요청 을 보 냅 니 다.요청 체 가 String 일 때 이렇게 설정 해 야 합 니 다.
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate
.getMessageConverters()
.set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
사용자 정의 StringHttpMessageConverter 가 없 으 면 기본 StringHttpMessageConverter 에서 사용 하 는 문자 집합 은 ISO 입 니 다.8859_1.요청 체 가 중국 어 를 포함 할 때 번 거 로 워 집 니 다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HttpClient에서 웹 페이지를 캡처하는 두 가지 방법1. NodeFilter를 이용하여 웹 페이지를 분석한다. 1. Parser a를 생성한다. url을 통해 인터넷의 웹 페이지 b를 추출한다. 로컬 웹 파일을 추출하여 파일을 읽고 웹 파일을 문자열로 전환한다. 2....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.