PATCH Verb en Android (OkHttp, Volley, Retrofit …)
Sé que una pregunta similar se ha hecho varias veces, pero no puedo encontrar una solución para un problema simple: verbo PATCH
.
Así que pregunto a cualquiera que resuelve el problema de PATCH en Android ya sea usando OkHttp, Volley o Retrofit (o si utilizó un método diferente o una biblioteca, por favor comparta).
- Android okHttp addFormDataPart dinámicamente para múltiples imágenes
- Petición POST de Retrofit con la autenticación HTTP básica: "No se puede reintentar el cuerpo HTTP transmitido"
- Picasso detectó un OkHttp no admitido en el classpath
- OkHttp en android para realizar solicitudes de red
- Descargar archivo binario de OKHTTP
He pasado 3 días cavando alrededor y no puedo encontrar ninguna solución a este problema. Todo lo que estoy tratando de hacer es hacer una actualización parcial de una tabla a través de API RESTful que se construye y corrió en el entorno. NET.
Actualmente estoy utilizando Volley, pero cada vez que ejecute la aplicación, me sale el error de excepción que dice algo a lo largo de las líneas de PATCH is not an allowed...?
y luego da una matriz de otros verbos que se pueden utilizar como "POST, PUT, GET …". Así que, no muy servicial.
He intentado usar OkHttp
como esto:
JSONObject infoRequestBody = new JSONObject(); try { infoRequestBody.put("Salutation", "MRrr."); infoRequestBody.put("FirstName", "Work Now!!"); infoRequestBody.put("LastName", "Test from my mobile again!! Okhttp"); infoRequestBody.put("MiddleName", "From the Mobile"); infoRequestBody.put("NickName", null); infoRequestBody.put("BirthDate", "1978-11-23T00:00:00.000Z"); infoRequestBody.put("CompanyName", null); // infoRequestBody.put("RegDate", "2015-01-18T23:39:13.873Z"); infoRequestBody.put("Gender", "Male"); infoRequestBody.put("IsPregnant", null); infoRequestBody.put("IsNursing", null); infoRequestBody.put("WorkPhone", null); infoRequestBody.put("WorkPhoneExt", null); infoRequestBody.put("PhoneNumber", null); infoRequestBody.put("Address", "My android app working!!"); infoRequestBody.put("Address2", null); infoRequestBody.put("City", null); infoRequestBody.put("State", "CA"); infoRequestBody.put("ZipCode", null); infoRequestBody.put("EmailAddress", "[email protected]"); infoRequestBody.put("Occupation", null); infoRequestBody.put("CountryofResidence", "United States"); infoRequestBody.put("CountryCode", "US"); infoRequestBody.put("Ethnicity", "Asian"); infoRequestBody.put("ModifiedDate", "2015-01-18T23:39:13.873Z"); infoRequestBody.put("ModifiedBy", null); infoRequestBody.put("AcceptedTerms", true); infoRequestBody.put("AcceptedPrivacyPolicyCheckbox", false); infoRequestBody.put("AcceptedUnder18ConsentCheckbox", false); } catch (JSONException e1) { e1.printStackTrace(); } RequestBody body = com.squareup.okhttp.RequestBody.create(JSON, infoRequestBody.toString()); com.squareup.okhttp.Request.Builder request = new com.squareup.okhttp.Request.Builder() .url("APIUrls.PATIENT_INFO_URL") .addHeader("Content-Type", "application/json") .addHeader("Accept", "application/json") .addHeader("X-ZUMO-APPLICATION", APIUrls.ZUMO_KEY) .patch(body); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(com.squareup.okhttp.Request request, IOException e) { } @Override public void onResponse(com.squareup.okhttp.Response response) throws IOException { if (!response.isSuccessful()) throw new IOException("Unexpected code" + response); Headers responseHeaders = response.headers(); for (int i = 0; i < responseHeaders.size(); i++) { System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i)); } System.out.println(response.body().string()); } });
pero client.newCall(request).enque(new Callback()...
me da un error diciendo que la request
no se puede aplicar a Request.Builder
.
Yo soy nuevo en OkHttp, por cierto.
De todos modos, he estado luchando para conseguir PATCH
para trabajar durante demasiado tiempo. Tal vez estoy rodando en la oscuridad, pero si alguien por ahí tiene alguna sugerencia, pensamientos sobre cómo conseguir 'PATCH' para trabajar, estaría para siempre agradecido a usted.
Gracias por tu ayuda.
- SocketTimeoutException actualización de Android
- HTTPS no envía algunos encabezados de autenticación con Retrofit
- Tienda de cookies persistente con okhttp 2 en Android
- Retrofit + RxJava no puede almacenar en caché las respuestas, los encabezados de respuesta sospechados
- Cómo implementar la manipulación de cookies en Android usando OkHttp?
- ¿Cómo reintentar las solicitudes HTTP con OkHttp / Retrofit?
- React Native & okhttp en Android - Establecer User-Agent
- OKhttp: SSLProtocolException: Protocolo de enlace SSL finalizado
Como GreyBeardedGeek dice, puede utilizar Retrofit + OkHttp para implementar esto.
RestAdapter restAdapter = new RestAdapter.Builder() .setClient(new OkClient()) .setEndpoint(ENDPOINT) .build(); MyPatchService patchService = restAdapter.create(MyPatchService.class); UserUpdate updatedUser = new UserUpdate(); updatedUser.Salutation = "Mr"; updatedUser.FirstName = "Adam"; patchService.update(updatedUser);
Y MyPatchService
parece a esto:
public interface MyPatchService { @PATCH("/some/update/endpoint") User update(UserUpdate updatedObject); }
Su clase UserUpdate
podría tener este aspecto:
public class UserUpdate { public String Salutation; public String FirstName; public String LastName; }
Si lo hace, el JSON que se enviará se verá así (tenga en cuenta que LastName
no se serializa ya que nunca se configuró – esto se puede configurar mediante el suministro de una instancia de Gson personalizada a Retrofit):
{ "Salutation": "Mr", "FirstName": "Adam" }
Los objetos de solicitud / respuesta son representaciones Java simples de los objetos que envía / recibe a través de la red. Siendo una solicitud de parche, puede hacer que su miembro vars Integer
, Boolean
, etc y no se serializan si no se establece (es decir, si son null
).
No he probado esto, pero aparentemente, si utilizas Retrofit con OKClient de OkHTTP, entonces Retrofit soporta una anotación @Patch.
Consulte http://square.github.io/retrofit/javadoc/retrofit/http/PATCH.html y Actualización y revisión HTTP
¡Bien! Gracias @ Adam y todos los que contribuyeron a conseguirme en la dirección correcta. Realmente lo aprecio. Así que, esto es lo que terminé haciendo (apenas personalizó lo que @Adam publicado, que por supuesto es la respuesta correcta!):
En primer lugar,
He configurado mi clase UserUpdate
como sigue:
public class UserUpdate { public String Salutation; public String FirstName; public String LastName; public String MiddleName; public String NickName; //Setters and Getters... public String getSalutation() { return Salutation; } public void setSalutation(String salutation) { Salutation = salutation; } public String getFirstName() { return FirstName; } public void setFirstName(String firstName) { FirstName = firstName; } public String getLastName() { return LastName; } public void setLastName(String lastName) { LastName = lastName; } public String getMiddleName() { return MiddleName; } public void setMiddleName(String middleName) { MiddleName = middleName; } public String getNickName() { return NickName; } public void setNickName(String nickName) { NickName = nickName; } }
y luego configuro la interface class
llamada PatientInfoAPI
:
public interface PatientInfoAPI{ @PATCH("/tables/PatientInformation/{id}") public void update(@Body UserUpdate updatedDAta, @Path("id") String id,Callback<UserUpdate> response); }
Tenga en cuenta que estoy pasando el id de la tabla para ser "PATCH'd", y lo más importante es que tengo la anotación @Body
que me permite pasar los datos a la actualización sin obtener un error (lo intenté sin él y estaba recibiendo un error)
Y finalmente dentro de mi actividad principal:
RestAdapter restAdapter = new RestAdapter.Builder() .setClient(new OkClient()) //very important!!! .setEndpoint(ENDPOINT)//base url .setRequestInterceptor(new RequestInterceptor() {//You may not need to pass headers, but I do, so this is how it's done. @Override public void intercept(RequestFacade request) { request.addHeader("Content-Type", "application/json"); request.addHeader("Accept", "application/json"); request.addHeader("X-ZUMO-APPLICATION", APIUrls.ZUMO_KEY); } }) .build(); PatientInfoAPI patchService = restAdapter.create(PatientInfoAPI.class); UserUpdate updatedUser = new UserUpdate(); updatedUser.setSalutation("Sr."); updatedUser.setFirstName("YesSirtItsWorking"); updatedUser.setLastName("Bays"); updatedUser.setMiddleName("ComeOn Now man!"); updatedUser.setNickName(""); //Passing the tableId along with the data to update patchService.update(updatedUser, APIUrls.TABLE_ID, new retrofit.Callback<UserUpdate>() { @Override public void success(UserUpdate userUpdates, retrofit.client.Response response) { Log.v("All is good", "Nickname:" + userUpdates.getNickName().toString() + " Email: " + userUpdates.getEmailAddress().toString()); } @Override public void failure(RetrofitError error) { Log.v("All is good", error.getLocalizedMessage().toString()); } });
Sé que tal vez algunos de los pasos no son muy sofisticados, pero para aquellos que están comenzando con Retrofit y OkHttp, y lo más importante han estado luchando para conseguir PATCH
para trabajar con Android, esta es la solución. Una vez más, los accesorios de @Adam para casi guiarme a través del proceso. @Adam fue el que realmente respondió a esta pregunta – Estoy poniendo todo junto para aquellos que puedan necesitar una para ver la imagen completa. ¡Gracias, @Adam !!! ¡Eres una estrella del rock!
- Eclipse editText eliminar el foco (cursor) cuando se hace presionado
- Cómo abrir el archivo descargado en android con la aplicación predeterminada predeterminada en android