0

场景是:“有适用于 HTTP 的适配器,被要求添加 FTP 支持”——听起来很合理。
有没有办法在同样合理的时间范围内做到这一点?
还是类似的机制/定制的 Volley 库来交换 Volley?

FTP 受密码保护,如果这有什么不同的话。

到目前为止尝试过:

  • HttpClientStack:Scheme 'ftp' not registered
  • HurlStack"libcore.net.url.FtpURLConnection cannot be cast to java.net.HttpURLConnection
  • 尝试通过自定义 URLonnection 建立隧道(多个困难,例如 libcore 包不公开)
  • 自定义 ImageCache,使 Volley 无需处理 FTP(这有什么意义,真的吗?)
4

1 回答 1

0

到目前为止,我唯一想到的就是:overrideperformRequest为 ftp 链接做一些完全不同的事情。
请注意,这里的代码很糟糕,它几乎没有达到我的目的:

public class HurlStackFtp extends HurlStack {

    @Override
    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
            throws IOException, AuthFailureError {

        String urlString = request.getUrl();
        if (urlString != null && urlString.startsWith("ftp://")) {
            return performFTPRequest(request, additionalHeaders);
        } else {
            return super.performRequest(request, additionalHeaders);
        }
    }


    public HttpResponse performFTPRequest(Request<?> request, Map<String, String> additionalHeaders)
        throws IOException, AuthFailureError {
        String url = request.getUrl();
        HashMap<String, String> map = new HashMap<String, String>();
        map.putAll(request.getHeaders());
        map.putAll(additionalHeaders);
        // UrlRewriter not supported

        InputStream input = getStreamFromFTP(url);
        StatusLine responseStatus = new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1),
                /*connection.getResponseCode()*/200, /*connection.getResponseMessage()*/"OK");
        BasicHttpResponse response = new BasicHttpResponse(responseStatus);
        response.setEntity(makeEntity(input));
        return response;
    }

    public static InputStream getStreamFromFTP(String url) throws IOException {
        URL parsedUrl = new URL(url);
        URLConnection cn = parsedUrl.openConnection();
        cn.connect();
        return cn.getInputStream();
    }

    private static HttpEntity makeEntity(InputStream inputStream) throws IOException {
        BasicHttpEntity entity = new BasicHttpEntity();
        entity.setContent(inputStream);
        entity.setContentLength(inputStream.available());
        entity.setContentType("binary/octet-stream"); // sigh...
        return entity;
    }
}
于 2015-09-04T09:26:44.797 回答