HTTP Patch request from Android

2020-05-19 10:13发布

问题:

I'm trying to do an HTTP Patch request from an Android application and haven't been able to figure it out. It looks like PATCH isn't supported by HTTPUrlConnection. HttpPatch doesn't seem to be in the libraries included on Android (link). Any ideas?

回答1:

If the Patch method is absolutely necessary you will have to import the Apache HttpClient as a jar dependency. This will increase the size of your app somewhat but it should not be a huge problem.

As a workaround you could try to just include this java code in your app:

/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.http.client.methods;

import java.net.URI;

import org.apache.http.annotation.NotThreadSafe;

/**
 * HTTP PATCH method.
 * <p>
 * The HTTP PATCH method is defined in <a
 * href="http://tools.ietf.org/html/rfc5789">RF5789</a>: <blockquote> The PATCH
 * method requests that a set of changes described in the request entity be
 * applied to the resource identified by the Request- URI. Differs from the PUT
 * method in the way the server processes the enclosed entity to modify the
 * resource identified by the Request-URI. In a PUT request, the enclosed entity
 * origin server, and the client is requesting that the stored version be
 * replaced. With PATCH, however, the enclosed entity contains a set of
 * instructions describing how a resource currently residing on the origin
 * server should be modified to produce a new version. </blockquote>
 * </p>
 *
 * @since 4.2
 */
@NotThreadSafe
public class HttpPatch extends HttpEntityEnclosingRequestBase {

    public final static String METHOD_NAME = "PATCH";

    public HttpPatch() {
        super();
    }

    public HttpPatch(final URI uri) {
        super();
        setURI(uri);
    }

    public HttpPatch(final String uri) {
        super();
        setURI(URI.create(uri));
    }

    @Override
    public String getMethod() {
        return METHOD_NAME;
    }

}


回答2:

We created our own HttpPatch class like:

public class HttpPatch extends HttpPost {
    public static final String METHOD_PATCH = "PATCH";

    public HttpPatch(final String url) {
        super(url);
    }

    @Override
    public String getMethod() {
        return METHOD_PATCH;
    }
}


回答3:

It looks like OkHttp supports patch

Request request = Request.Builder().url().patch().build();


回答4:

Its amazing.Its working like a charm.

Use HttpPost Call and set header as

httpost.setHeader("X-HTTP-Method-Override", "PATCH");

Or

Simply copy & paste this code

public static JSONObject makeRequestCheck(String hostname, String token,String proId,String taskGrpId, String taskId) throws Exception {

    SSLSocketFactory sslFactory = new SimpleSSLSocketFactory(null);
    sslFactory
            .setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
    registry.register(new Scheme("https", sslFactory, 443));
    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params,
            registry);
    HttpClient client = new DefaultHttpClient(ccm, params);
    String hostnamee = hostname+"projects/"+proId+"/taskgroups/"+taskGrpId+"/tasks/"+taskId+"/complete";
    HttpPost httpost = new HttpPost(hostnamee);
    System.out.println(hostnamee);
//  StringEntity se = new StringEntity(jsonSignin.toString());

    HttpResponse response = null;
    try {
    //  httpost.setEntity(se);
        httpost.setHeader("X-HTTP-Method-Override", "PATCH");
        httpost.setHeader("Content-type", "application/json");
        httpost.setHeader("Accept", "*/*");
        httpost.setHeader("Accept-Encoding", "gzip, deflate");
        httpost.addHeader("Connection", "keep-alive");
        httpost.addHeader("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6");
        httpost.setHeader("User-Agent", "nnst");
        httpost.setHeader("Accept-Charset", "utf-8");
        if (token == "NV") {
        } else {
            httpost.setHeader("Authorization", "Token" + " " + token);
        }
        response = client.execute(httpost);

    } catch (Exception e) {
        System.out.println("::my Exception ::" + e);
    }
    if (response == null) {
        System.out.println("no data");
    }
    String output = EntityUtils.toString(response.getEntity());

    JSONObject jobj = new JSONObject(output);

    return jobj;
}


标签: android http