当前位置: 首页 > 知识库问答 >
问题:

如何处理Android API23中的截击(删除了相关的apache http包)?

斜烈
2023-03-14

在我更新sdk并在我的项目中使用API23后,我发现有一些错误,因为找不到相关的包,然后我找到它,知道API23已经删除了apache http包。
那么现在什么是旧的apache http包的替代品,换句话说,如何在Android API23中处理volley以避免错误。
我去过Volley的谷歌源搜索新版本,但似乎没有解决方案。

共有1个答案

通飞尘
2023-03-14

下面是我为volley https://gist.github.com/hussainderry/0b31063b0c9dcb1cbaec编写的一个多部分请求。它使用OkHttp,因此您不必再担心Apache问题。

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;

import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.RequestBody;

import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import okio.Buffer;

/**
 * Multipart request for Google's Volley using Square's OkHttp.
 * @author Hussain Al-Derry
 * @version 1.0
 * */
public class VolleyMultipartRequest extends Request<String> {

    /* Used for debugging */
    private static final String TAG = VolleyMultipartRequest.class.getSimpleName();

    /* MediaTypes */
    public static final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
    public static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    public static final MediaType MEDIA_TYPE_TEXT_PLAIN = MediaType.parse("text/plain");

    private MultipartBuilder mBuilder = new MultipartBuilder();
    private final Response.Listener<String> mListener;
    private RequestBody mRequestBody;

    public VolleyMultipartRequest(String url,
                                  Response.ErrorListener errorListener,
                                  Response.Listener<String> listener) {
        super(Method.POST, url, errorListener);
        mListener = listener;
        mBuilder.type(MultipartBuilder.FORM);
    }

    /**
     * Adds a collection of string values to the request.
     * @param mParams {@link HashMap} collection of values to be added to the request.
     * */
    public void addStringParams(HashMap<String, String> mParams){
        for (Map.Entry<String, String> entry : mParams.entrySet()) {
            mBuilder.addPart(
                    Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""),
                    RequestBody.create(MEDIA_TYPE_TEXT_PLAIN, entry.getValue()));
        }
    }

    /**
     * Adds a single value to the request.
     * @param key String - the field name.
     * @param value String - the field's value.
     * */
    public void addStringParam(String key, String value) {
        mBuilder.addPart(
                Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
                RequestBody.create(MEDIA_TYPE_TEXT_PLAIN, value));
    }

    /**
     * Adds a binary attachment to the request.
     * @param content_type {@link MediaType} - the type of the attachment.
     * @param key String - the attachment field name.
     * @param value {@link File} - the file to be attached.
     * */
    public void addAttachment(MediaType content_type, String key, File value){
        mBuilder.addPart(
                Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
                RequestBody.create(content_type, value));
    }

    /**
     * Builds the request.
     * Must be called before adding the request to the Volley request queue.
     * */
    public void buildRequest(){
        mRequestBody = mBuilder.build();
    }

    @Override
    public String getBodyContentType() {
        return mRequestBody.contentType().toString();
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try
        {
            Buffer buffer = new Buffer();
            mRequestBody.writeTo(buffer);
            buffer.copyTo(bos);
        } catch (IOException e) {
            Log.e(TAG, e.toString());
            VolleyLog.e("IOException writing to ByteArrayOutputStream");
        }
        return bos.toByteArray();
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    public Request<?> setRetryPolicy(RetryPolicy retryPolicy) {
        return super.setRetryPolicy(retryPolicy);
    }

    @Override
    protected void deliverResponse(String response) {
        if (mListener != null) {
            mListener.onResponse(response);
        }
    }
}

希望有用。

 类似资料:
  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的超文本传输协议请求。javascript向服务器发送一个HTTP DELETE请求,其中包括路径中对象的id,并在JSON对象中发送请求正文中的注释。 我已经尝试用一个JavaWeb服务对象和一个普通的servlet来实现删除请求。在这两种情况下,当我在没有正文的情况下提出请求时,它都是有效的,但当我添

  • 很抱歉,如果这是显而易见的,但我们已经为这件事挠头好几天了。 考虑三个实体,Parent、Child和x: X与Child有@ManyToOne关系,可选=true。 当我们删除一个父级时,理想情况是这样的。我们希望delete级联并移除与已删除父行相对应的所有子行。目前还没问题。但我们也希望引用任何已删除子项的任何X将子项关系清空。我们不想删除任何X,我们只想将关系空掉。这与它是一种“可选的”关

  • 如题 比如我写文章的时候插入了两张图片A和B 编辑的时候,删除了图片B 后端如何知道删除的图片?从而将图片数据从数据库删除和图片文件从ftp删除? 通过前端提交的文本中图片的连接,和数据库的对比获取?

  • 当到达脚本尾部或出现了未能捕捉到的异常时,Ruby会结束程序(当调用函数exit、abort或对主线程发出Thread.kill命令时,会引发SystemExit异常)。结束程序时会依次进行下列处理。 对所有线程执行Thread.kill。 若注册了Ruby的伪信号SIGEXIT的处理程序的话,就执行它(请参考trap)。 若注册了END块(END {...}或at_end函数指定的块)的话,就以

  • 本文向大家介绍了解java Struts拦截器的相关操作,包括了了解java Struts拦截器的相关操作的使用技巧和注意事项,需要的朋友参考一下 实现aop的方式 用于实现action之前 一般用于事物操作. 一般用于对某些未授权的页面访问的时候,进行拦截操作,拦截非法访问. 开箱即用拦截器 必须有传递属性这个拦截器 运行输出日志如下 可以看到这个action一共运行耗时12ms 自定义拦截器