OkHttp 프레임 워 크 2 차 패키지, post json 형식의 인자 (상)

OkHttp 프레임 워 크 2 차 패키지, post json 형식의 인자 (상)
요청 한 패키지
이 편 은 주로 배경 데이터 형식 에 대한 요청 매개 변 수 를 봉인 합 니 다.패 키 징 의 목적 은 배경 데이터 구조 에 맞 춰 클 라 이언 트 가 데이터 요청 과 응답 데 이 터 를 처리 하 는 데 편리 하도록 하 는 것 입 니 다.
데이터 요청 형식
데이터 요청 의 요청 은 JSon 형식 으로 서버 에 파 라 메 터 를 전달 합 니 다. 이 예 에서 파 라 메 터 는 공 삼 과 사 삼 으로 나 뉘 는데 요청 체 구 조 는 다음 과 같 습 니 다.
{
    "args": {
        "pri_args": {
            "username": "xxxxxx",  
            "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
        },
        "pub_args": {        
            "appversion": "xxx",   
            "imei": "xxxxxxxx",  
            "token": "xxxxxxxx",   
            "uid": xxxxxx 
        }
    }
}

사용 과정 에서 가장 먼저 해 야 할 일 은 매개 변수 에 대한 조합 이다. 개인 매개 변수 와 공 삼 을 분리 하 는 것 이다. 전체 앱 에 로그 인 만 하면 인 터 페 이 스 를 요청 할 때마다 공 삼 은 상대 적 으로 고정 되 어 있 기 때문에 공 삼 을 숨 길 수 있 고 사용자 가 요청 할 때마다 스스로 공 삼 을 써 서 전송 하지 않 아 도 된다. app 이 열 릴 때 공 삼 에 값 을 부여 해 야 한다.그리고 모든 인터페이스 에 대해 서 는 사 참 만 전달 하면 된다.
앞 말 을 하 다
프로젝트 는 홍 양 대신 이 봉 인 된 Okhttp - utils 프레임 워 크 를 사용 합 니 다. JSon 형식의 데이터 요청 에 따라 2 차 봉 인 했 습 니 다. 대신 을 경 배 합 니 다!다음은 원래 프레임 워 크 주소: 블 로그 주소:http://blog.csdn.net/lmj623565791/article/details/47911083
github:https://github.com/hongyangAndroid/okhttp-utils
개폐 원칙 에 따라 2 차 포장 은 원래 의 틀 에 칼 을 휘 두 르 지 않 고 원래 의 틀 에 의존 할 뿐 이 를 바탕 으로 2 차 포장 을 했 을 뿐이다.
【 Look here 】: 배경 에서 정 의 된 요청 형식 이 다 르 기 때문에 반환 필드 에 도 차이 가 있 습 니 다. args, priargs、pub_args 등 이 필드 들 은 모두 같 지 않 기 때문에 본 글 에 포 장 된 프레임 워 크 는 직접 가 져 와 서 사용 할 수 없 을 수도 있 습 니 다. 그러나 제 가 포장 한 것 을 참조 하여 조롱박 에 따라 바 가 지 를 그 릴 수 있 습 니 다. 본 편 은 자신 이 포장 할 때의 생각 과 쓴 후의 경험 만 소개 하고 기술 공 유 는 말 할 것 도 없 으 니 참고 하 시기 바 랍 니 다.
매개 변수의 조합
원래 Okhttp - utils 에 서 는 json 형식 매개 변수 에 대한 패키지 가 없 었 지만 String 형식 매개 변수 에 대한 패키지 방법 postString 이 있 습 니 다. 이 방법 을 빌려 서 이 방법 을 한 번 더 패키지 할 수 있 습 니 다. 이 효 과 는 사용 할 때 맵 으로 들 어 가 는 것 입 니 다.
    OkHttpUtils.postString().url(THost.HOST).content(paramContent).build().execute(callback);

사용 할 때 url 과 content 를 입력 한 다음 potstring 이 실제 적 으로 PostString Builder 형식의 대상 인 스 턴 스 를 되 돌려 주 는 것 을 볼 수 있 습 니 다.
OkHttpUtils.java
public static PostStringBuilder postString() {
    return new PostStringBuilder();
}

그리고 이 대상 의 build 방법 을 통 해 url 과 content 인 자 를 전송 하여 RequestCall 대상 을 만 들 었 습 니 다.
PostStingBuilder.java
 public RequestCall build() {
    return (new PostStringRequest(this.url, this.tag, this.params, this.headers, this.content, this.mediaType, this.id)).build();
}

OkHttpRequest.java
public RequestCall build() {
    return new RequestCall(this);
}

마지막 으로 execute 방법 으로 요청 을 보 내 고 이 방법 에 두 개의 인 자 를 보 냈 습 니 다. 하 나 는 방금 생 성 된 RequestCall 대상 이 고 다른 하 나 는 자신 이 정의 한 Callback 입 니 다.
 public void execute(final RequestCall requestCall, Callback callback)
{
    ......
}

우리 가 해 야 할 일 은 1. 프레임 워 크 사용자 에 게 방법 을 제공 하여 Map 유형의 인 자 를 전달 하 는 것 이다.2. 들 어 오 는 매개 변 수 를 json string 3 으로 바 꾸 고 얻 은 json string 을 post String 방법 으로 보 냅 니 다.
전 삼 이 든 전환 이 든 모두 Builder 에서 쓸 수 있 습 니 다.
우 리 는 PostStringBuilder 클래스 를 템 플 릿 으로 하여 PostJSonBuilder 클래스 를 새로 만 들 수 있 습 니 다.
public class TPostJsonBuilder extends OkHttpRequestBuilder {

private String paramContent;
private MediaType mediaType;

private Map pri_args;
private Map pub_args;

public TPostJsonBuilder() {
    this.pri_args = new HashMap<>() ;
    this.pub_args = new HashMap<>() ;
}

public TPostJsonBuilder(String paramContent, Map pri_args, MediaType mediaType, Map pub_args) {
    this.paramContent = paramContent;
    this.pri_args = pri_args;
    this.mediaType = mediaType;
    this.pub_args = pub_args;
}

public TPostJsonBuilder pri_args(Map args) {
    this.pri_args = args  ;
    return  this;
}
public TPostJsonBuilder pub_args(Map args) {
    this.pub_args = args  ;
    return  this;
}

public TPostJsonBuilder paramContent(String content) {
    if (content != null) {
        this.paramContent = content;
    } else if (this.pri_args.size() != 0 && this.pub_args.size() != 0){
        this.paramContent = initParams(this.pri_args,this.pub_args) ;
    } else {
        Exceptions.illegalArgument("args cannot be null !");
    }
    return this;
}
//              ,            json string
private String initParams(Map pri_args, Map pub_args) {
    Map> priArgs = new HashMap<>();
    priArgs.put("pri_args",pri_args);

    Map> pubArgs = new HashMap<>();
    pubArgs.put("pub_args",pub_args);

    Map>> args = new HashMap<>() ;
    // pub_args   pri_args 
    priArgs.putAll(pubArgs);
    args.put("args",priArgs);
    Gson g = new Gson();
    String argsStr = g.toJson(args) ;

    return argsStr ;
}


public TPostJsonBuilder mediaType(MediaType mediaType)
{
    this.mediaType = mediaType;
    return this;
}
@Override
public RequestCall build() {
    paramContent = initParams(this.pri_args,this.pub_args) ;
    mediaType = MediaType.parse("application/json;charset=utf-8") ;
    return new PostStringRequest(url,tag,params,headers,paramContent,mediaType,id).build();
}
}

안에 매개 변 수 를 사 참 pri 로 나 눕 니 다.args 와 공 삼 pubargs 두 부분, 그리고 이 두 매개 변수 에 반환 값 이 TPostJSonBuilder 대상 인 방법 을 노출 시 켜 사용자 가. priargs(pri).pub_args (pub) 에서 매개 변 수 를 전달 합 니 다.그 다음 에 관건 적 인 initParams 방법 에서 사 참 과 공 삼 을 서버 에 필요 한 형식 으로 연결 한 다음 에 json string 으로 전환 하고 build 방법 에서 PostStringRequest 를 통 해 RequestCall 을 구축 합 니 다.이러한 매개 변수의 패 키 징 은 기본적으로 완성 되 었 다.
그 다음 에 사용자 에 게 postJSon 방법 을 폭로 하 는 것 입 니 다. 우 리 는 OkHttpUtils 에서 계승 하 는 종 류 를 씁 니 다.
TOkhttpUtil.java
public class TOkhttpUtil extends OkHttpUtils {


public static void initPubParams(Map pub_args) {
    TPublicParam.publicparam = pub_args ;
}
public static void initHeadS(String s) {
    TPublicParam.headparam.put("s",s) ;
}

public TOkhttpUtil(OkHttpClient okHttpClient) {
    super(okHttpClient);
}

public static TPostJsonBuilder postJson() { return  new TPostJsonBuilder(); }

}

TPostJSonBuilder 대상 을 되 돌려 주 는 방법 이 있 습 니 다.그리고 두 가지 방법 이 있 습 니 다. initPub Params 와 initHeadS, 이 두 가지 방법 은 공 삼 과 요청 헤더 에 대한 패키지 입 니 다.이 예 에서 요청 머리 에 2 개의 필드 가 있 고 s 필드 는 상대 적 으로 변 하지 않 으 며 m 필드 는 인터페이스 마다 다 르 기 때문에 s 를 먼저 밀봉 할 수 있 습 니 다. 다음은 말씀 드 리 겠 습 니 다.
이렇게 TOkhttUtil 을 이렇게 사용 할 수 있 습 니 다.
TOkhttpUtil.postJson().url(THost.HOST).pri_args(pri_args).pub_args(pub_args).build().execute(callback)

그 중의 priargs 와 pubargs 는 각각 전해 야 할 공 삼 과 사 삼 이다. 예 를 들 어:
Map pri_args = new HashMap<>();
pri_args.put("username","  ");
pri_args.put("password","4f32d39b42v322vkj43");

Map pub_args = new HashMap<>();
pub_args.put("appversion","1.0.1");
pub_args.put("imei","0000-0033-3300-3232-9909-3333");
pub_args.put("token","4f32d39b42v322vkj43");
pub_args.put("uid",9527);

글 의 시작 부분 에 전달 할 매개 변수 형식 을 얻 을 수 있 습 니 다.
매개 변수 패키지
요청 할 수 있 지만, 공 삼 의 값 은 대부분 변 하지 않 습 니 다. 호출 방법 마다 pubargs 도 좋 지 않 기 때문에 패 키 징 파 라 메 터 를 통 해 여러 개의 재 업로드 방법 을 노출 하여 사용자 가 더욱 편리 하 게 사용 할 수 있 습 니 다.
TBaseApi.java
public class TBaseApi {

//      , url,   ,  ,  ,  
public static void createPostRequest(String url, Map heads, Map pri_args, Map pub_args, TBaseCallback callback){
    TOkhttpUtil.postJson()
        .url(url)
        .headers(heads)
        .pri_args(pri_args)
        .pub_args(pub_args)
        .build()
        .execute(callback) ;
}
//     ,         。
public static void createPostRequest(String url, Map heads, Map pri_args, TBaseCallback callback){
    TOkhttpUtil.postJson()
            .url(url)
            .headers(heads)
            .pri_args(pri_args)
            .pub_args(TPublicParam.publicparam)
            .build()
            .execute(callback) ;
}
//     HOST
public static void createPostRequest(Map heads, Map pri_args, TBaseCallback callback){
    TOkhttpUtil.postJson()
            .url(THost.HOST)
            .headers(heads)
            .pri_args(pri_args)
            .pub_args(TPublicParam.publicparam)
            .build()
            .execute(callback) ;
}
//        s  ,   m     。
public static void createPostRequest(String headM, Map pri_args, TBaseCallback callback){
    TOkhttpUtil.postJson()
            .url(THost.HOST)
            .headers(TPublicParam.addHeadM(headM))
            .pri_args(pri_args)
            .pub_args(TPublicParam.publicparam)
            .build()
            .execute(callback);

}
}

위의 방법 에 서 는 여러 가지 선택 을 제 공 했 고 TPublic Param 에 서 는 공 삼 을 봉 했다.사용 할 때 초기 화 할 때 고정된 공 삼 과 사 삼 을 넣 으 면 됩 니 다.
예 를 들 어 TApplication. java 에서 초기 화:
OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(10*1000L, TimeUnit.MILLISECONDS)
            .readTimeout(10*1000L, TimeUnit.MILLISECONDS)
            .build();
TOkhttpUtil.initClient(client) ;
  TOkhttpUtil.initPubParams(TPublicParam.addPublicParams(pubParams));
TOkhttpUtil.initHeadS(TConstants.getS());

이렇게 하면 나중에 호출 할 때 최소한 의 인자 만 전달 할 수 있 습 니 다. 예 를 들 어 요청 헤드 의 m 필드, 개인 참조, 사용자 정의 콜 백 등 입 니 다. 이미 봉 인 된 머리의 s 필드 와 공 삼 은 신경 쓰 지 않 아 도 됩 니 다.
예 를 들 면:
Map<String,Object> pri_args = new HashMap();
TBaseCallback callback = new ....
TBaseApi.createPostRequest("getUserInfo",pri_args,callback) ;

다음 편 에 서 는 응답 하 는 패키지 와 TBase Callback 이 무엇 인지 소개 한다.관심 이 있 으 면 다음 편 을 볼 수 있다.http://blog.csdn.net/black_dreamer/article/details/53068627
github 주소:https://github.com/herdotage/Android_sample/tree/master/LOkhttpUtils

좋은 웹페이지 즐겨찾기