Okhttp 소스 코드

프로 토 콜: 프로 토 콜, http 네 가지 프로 토 콜
Request: 변경 할 수 없 는 요청 입 니 다.url method headers body 포함.
Request 에 정적 클래스 Builder 속성 url method headers body 가 있 습 니 다.
구조 방법:
 public Builder() {
  this.method = "GET";
  this.headers = new Headers.Builder();//    
}

Builder(Request request) {
  this.url = request.url;
  this.method = request.method;
  this.body = request.body;
  this.tag = request.tag;
  this.headers = request.headers.newBuilder();
}

Builder 정적 클래스 방법: (Builder 를 되 돌려 주 는 형식 으로)
 public Builder url(HttpUrl url) {}

 public Builder url(String url) {}

 public Builder url(URL url) {}
//     
 public Builder header(String name, String value) {}
//     
public Builder addHeader(String name, String value) {}
//     
public Builder removeHeader(String name) {}
//--------------------------------------
//    
 public Builder get() {}
 public Builder post(RequestBody body) {}
 public Builder delete(RequestBody body) {}
 public Builder delete(){}
 public Builder put(RequestBody body) {}
 public Builder patch(RequestBody body) {}

public Builder method(String method, RequestBody body) {}
//  Request  
 public Request build() {}

Requst 방법:
//     
public Headers headers() {}
//     
public String header(String name) {}
//
public List headers(String name) {}
//  body
public RequestBody body() { return body;}
//  Builder  
public Builder newBuilder() {}

RequestBody: 요청 체 는 추상 적 인 클래스 입 니 다.
방법: abstract contentType()// public long contentLength() throws IOException {return -1;}// public abstract void writeTo(BufferedSink sink) throws IOException;//
//    body     "UTF-8"
`public static RequestBody create(MediaType contentType, String content) {}
//    RequestBody     
public static RequestBody create(final MediaType contentType, final ByteString content) {}
//    RequestBody   ,          
public static RequestBody create(final MediaType contentType, final byte[] content,
  final int offset, final int byteCount) {}
//    RequestBody   ,       
 public static RequestBody create(final MediaType contentType, final File file) {}

응답 응답
ResponseBody 응답 (추상 클래스)
`
Call: 실행 할 호출 준비 (인터페이스)
Request request();//  

Response execute() throws IOException;//    

void enqueue(Callback responseCallback);//    

boolean isExecuted();//      

boolean isCanceled();//      

Call clone();//clone       

interface Factory {
Call newCall(Request request);}

웹 소켓 인터페이스
네 가지 상태: 연결 열기 닫 기 닫 기 취소
Request request();//    

long queueSize();//             

boolean send(String text);

boolean send(ByteString bytes);

boolean close(int code, String reason);

void cancel();

interface Factory {
WebSocket newWebSocket(Request request, WebSocketListener listener);}

RealCall
implements 호출 인터페이스
Callback: 인터페이스
onFailure 연결 실패 onResponse 연결 성공
Authenticator: 인터페이스
Request authenticate(Route route, Response response) throws IOException;//           

Headers:
헤드 정 보 는 키 쌍 으로 구성 되 어 해당 정 보 를 전달 할 수 있 습 니 다. 속성 이 있 습 니 다. String[] namesAndValues;Builder builder구조 방법
`Headers(Builder builder) {
this.namesAndValues = builder.namesAndValues.toArray(new String[builder.namesAndValues.size()]);
}

private Headers(String[] namesAndValues) {
this.namesAndValues = namesAndValues;
}`

방법.
//                。
  private static String get(String[] namesAndValues, String name) {
for (int i = namesAndValues.length - 2; i >= 0; i -= 2) {
  if (name.equalsIgnoreCase(namesAndValues[i])) {
    return namesAndValues[i + 1];
  }
}
return null;
}

호출 방법:
public String get(String name){}//     

public Date getDate(String name) {}//    

public int size() {}//     

public String name(int index) {}// index      

public String value(int index) {}// index     

public Set names() {}//      

public List values(String name) {}//          

public Builder newBuilder() {}//      Builder  

//  Headrs  (       )
public static Headers of(Map headers) {
if (headers == null) throw new NullPointerException("headers == null");

    // Make a defensive copy and clean it up.
    String[] namesAndValues = new String[headers.size() * 2];
    int i = 0;
    for (Map.Entry header : headers.entrySet()) {
      if (header.getKey() == null || header.getValue() == null) {
        throw new IllegalArgumentException("Headers cannot be null");
      }
      String name = header.getKey().trim();
      String value = header.getValue().trim();
      if (name.length() == 0 || name.indexOf('\0') != -1 || value.indexOf('\0') != -1) {
        throw new IllegalArgumentException("Unexpected header: " + name + ": " + value);
      }
      namesAndValues[i] = name;
      namesAndValues[i + 1] = value;
      i += 2;
    }

    return new Headers(namesAndValues); }

Builder 정적 내부 클래스:
//           
 public Builder add(String name, String value) {
  checkNameAndValue(name, value);//     
  return addLenient(name, value);
}
 //       
 Builder addLenient(String name, String value) {
  namesAndValues.add(name);
  namesAndValues.add(value.trim());
  return this;
}

//          。
public Builder removeAll(String name) {
  for (int i = 0; i < namesAndValues.size(); i += 2) {
    if (name.equalsIgnoreCase(namesAndValues.get(i))) {
      namesAndValues.remove(i); // name
      namesAndValues.remove(i); // value
      i -= 2;
    }
  }
  return this;
}

//       。
 public Builder set(String name, String value) {
  checkNameAndValue(name, value);
  removeAll(name);
  addLenient(name, value);
  return this;
}

//        。
 public String get(String name) {
  for (int i = namesAndValues.size() - 2; i >= 0; i -= 2) {
    if (name.equalsIgnoreCase(namesAndValues.get(i))) {
      return namesAndValues.get(i + 1);
    }
  }
  return null;
}

//     Header  。
public Headers build() {
  return new Headers(this);
}

연결 인터페이스
Route route();//      

Socket socket();//     socket

Handshake handshake();//         

Protocol protocol();//      

커 넥 션 풀 연결 풀
ConnectionSpec 연결 규범
Route

좋은 웹페이지 즐겨찾기