okhttpベースのパッケージングネットワークライブラリ(2)

9381 ワード

okhttpベースのパッケージングネットワークライブラリ(2)
前言:前編は基礎的な抽象クラスをカプセル化しただけで、jsonリクエストを送信する必要があるとしたら、BaseRequestをどのように拡張すればいいのでしょうか.
ステップ1:MediaTypeを確定して解析する
    //     okhttp3.MediaType   
    public static final MediaType Media_Json = MediaType.parse("application/json; charset=utf-8");

    //BaseRequest       
    public MediaType getMediaType() {
        return Media_Json;
    }

ステップ2 bodyMapをJson形式に解析
    protected String getRequestString() {
        if (mBodyMap != null && mBodyMap.size() > 0) {
            try {
                // fastjson              bodymap     json  api,        。
                String json = JSON.toJSONString(mBodyMap, SerializerFeature.WriteNullStringAsEmpty);
                return json.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

結果:JsonRequest
public abstract class JSONRequest<T> extends BaseRequest<T> {
    public static final MediaType Media_Json = MediaType.parse("application/json; charset=utf-8");

    public JSONRequest(  ) {
        super( );
    }

    public MediaType getMediaType() {
        return Media_Json;
    }

    protected String getRequestString() {
        if (mBodyMap != null && mBodyMap.size() > 0) {
            try {
                String json = JSON.toJSONString(mBodyMap, SerializerFeature.WriteNullStringAsEmpty);
                return json.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

上はPOSTリクエスト方式の本体コンテンツフォーマットのパッケージにすぎず、ビジネス層が呼び出すリクエストクラスJsonReQuestTaskを本格的に書き始めた.考え方も簡単で、基礎抽象類の抽象方法を完成すればいいので、原理は前編の冒頭で述べた.
public class JsonReQuestTask extends JSONRequest {

    public BookDetailTask() {
        super();
    }

    @Override
    public String getApi() {
        return "/api";
    }

    @Override
    public int getHttpMethod() {
        return HttpMethod.POST;
    }

    @Override
    public Class getModelClass() {
        return Bean.class;
    }

拡張:フォーム要求FormRequest

public abstract class FormRequest<T> extends BaseRequest<T> {

    public static final MediaType Media_FORM = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");

    public FormRequest() {
        super();
    }

    public MediaType getMediaType() {
        return Media_FORM;
    }

    protected String getRequestString() {
        if (mBodyMap != null && mBodyMap.size() > 0) {
            try {
                String json = encodeParameters(mBodyMap, "utf-8");
                return json.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return "";
    }
}

拡張:ファイルアップロードMultipartRequest
public abstract class MultiPartRequest<T> extends FormRequest<T> {

    public static final MediaType Media_PART = MediaType.parse("multipart/form-data; charset=utf-8");

    protected List mFiles = new ArrayList();

    public MultiPartRequest() {
        super();
    }

    public MediaType getMediaType() {
        return Media_PART;
    }

    protected Request buildRequest() {
        RequestBody body = null;
        Request.Builder builder = new Request.Builder();

        switch (getHttpMethod()) {
            case HttpMethod.GET:
                //TODO     ,     GET   。
                break;
            case HttpMethod.POST:
                MultipartBody.Builder bodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
                for (File file : mFiles) {
                    if (file.exists()) {
                        RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
                        bodyBuilder.addFormDataPart("file", file.getName(), requestBody);
                    }
                }

                for (Map.Entry entry : mBodyMap.entrySet()) {
                    if (TextUtils.isEmpty(entry.getKey()) || TextUtils.isEmpty(entry.getValue())) {
                        continue;
                    }
                    bodyBuilder.addFormDataPart(entry.getKey(), entry.getValue());
                }

                body = bodyBuilder.build();
                builder.url(getUrl()).post(body);
                break;
            default:
                //TODO
                break;
        }
        return builder.build();
    }


}

まとめ:実はJsonフォーマットのパッケージに対して実は難しくなくて、構想がはっきりしている限り一歩でいいので、次の編は実際に豆弁に対する図書の要求を操作しましょう!