Android 中的 PATCH 动词(OkHttp、Volley、Retrofit...)
PATCH Verb in Android (OkHttp, Volley, Retrofit...)
我知道类似的问题已经被问过几次了,但我似乎找不到一个简单问题的解决方案:PATCH
动词。
所以我问任何通过使用 OkHttp、Volley 或 Retrofit(或者如果您使用不同的方法或库,请分享)解决了 Android 中的 PATCH 问题的人。
我花了 3 天时间四处寻找,但找不到解决此问题的方法。我想要做的就是通过 RESTful API 对 table 进行部分更新,它是在 .NET 环境中构建的 运行。
我目前正在使用 Volley,但每次我 运行 应用程序时,我都会收到异常错误,它说了一些类似 PATCH is not an allowed...?
的内容,然后它给出了一系列其他动词可以使用如"POST, PUT, GET..."。所以,一点帮助都没有。
我试过这样使用 OkHttp
:
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@me.com");
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());
}
});
但是 client.newCall(request).enque(new Callback()...
给我一个错误,说 request
不能应用于 Request.Builder
。
顺便说一句,我是 OkHttp 的新手。
无论如何,我一直在努力让 PATCH
工作太久了。也许我在黑暗中拍摄,但如果有人有任何建议,关于如何让“PATCH”工作的想法,我将永远感激你。
感谢您的帮助。
我还没有尝试过,但显然,如果您将 Retrofit 与 OkHTTP 的 OKClient 一起使用,那么 Retrofit 将支持 @Patch 注释。
见http://square.github.io/retrofit/javadoc/retrofit/http/PATCH.html and
正如 GreyBeardedGeek 所说,您可以使用 Retrofit + OkHttp 来实现它。
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);
而 MyPatchService
看起来像这样:
public interface MyPatchService {
@PATCH("/some/update/endpoint")
User update(UserUpdate updatedObject);
}
您的 UserUpdate
class 可能如下所示:
public class UserUpdate {
public String Salutation;
public String FirstName;
public String LastName;
}
如果您这样做,将发送的 JSON 将如下所示(请注意 LastName
未序列化,因为它从未设置过 - 这可以通过提供自定义 Gson 改造实例):
{
"Salutation": "Mr",
"FirstName": "Adam"
}
request/response 对象是您通过网络 send/receive 对象的简单 Java 表示。作为补丁请求,您可以让您的成员变量 Integer
、Boolean
等,如果未设置它们将不会被序列化(即如果它们是 null
)。
好的!感谢@Adam 和所有帮助我走向正确方向的人。真的很感激。所以,这就是我最终做的事情(我几乎没有自定义@Adam 发布的内容,这当然是正确的答案!):
首先,
我的 UserUpdate
class 设置如下:
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;
}
}
然后我设置了 interface class
调用 PatientInfoAPI
:
public interface PatientInfoAPI{
@PATCH("/tables/PatientInformation/{id}")
public void update(@Body UserUpdate updatedDAta, @Path("id") String id,Callback<UserUpdate> response);
}
注意我将 table id 传递给 "PATCH'd",最重要的是我有 @Body
注释,它允许我将数据传递给更新而无需获取错误(我试过没有它但出现错误)
最后进入我的主 Activity:
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());
}
});
我知道也许有些步骤不是很复杂,但对于那些刚开始使用 Retrofit 和 OkHttp 的人来说,最重要的是一直在努力让 PATCH
与 Android 一起工作,这就是解决方案。同样,@Adam 的支持在很大程度上指导了我完成整个过程。 @Adam 是真正回答了这个问题的人——我只是把所有内容放在一起,供那些可能需要查看全貌的人使用。谢谢,@亚当!!!你是摇滚明星!
我知道类似的问题已经被问过几次了,但我似乎找不到一个简单问题的解决方案:PATCH
动词。
所以我问任何通过使用 OkHttp、Volley 或 Retrofit(或者如果您使用不同的方法或库,请分享)解决了 Android 中的 PATCH 问题的人。
我花了 3 天时间四处寻找,但找不到解决此问题的方法。我想要做的就是通过 RESTful API 对 table 进行部分更新,它是在 .NET 环境中构建的 运行。
我目前正在使用 Volley,但每次我 运行 应用程序时,我都会收到异常错误,它说了一些类似 PATCH is not an allowed...?
的内容,然后它给出了一系列其他动词可以使用如"POST, PUT, GET..."。所以,一点帮助都没有。
我试过这样使用 OkHttp
:
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@me.com");
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());
}
});
但是 client.newCall(request).enque(new Callback()...
给我一个错误,说 request
不能应用于 Request.Builder
。
顺便说一句,我是 OkHttp 的新手。
无论如何,我一直在努力让 PATCH
工作太久了。也许我在黑暗中拍摄,但如果有人有任何建议,关于如何让“PATCH”工作的想法,我将永远感激你。
感谢您的帮助。
我还没有尝试过,但显然,如果您将 Retrofit 与 OkHTTP 的 OKClient 一起使用,那么 Retrofit 将支持 @Patch 注释。
见http://square.github.io/retrofit/javadoc/retrofit/http/PATCH.html and
正如 GreyBeardedGeek 所说,您可以使用 Retrofit + OkHttp 来实现它。
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);
而 MyPatchService
看起来像这样:
public interface MyPatchService {
@PATCH("/some/update/endpoint")
User update(UserUpdate updatedObject);
}
您的 UserUpdate
class 可能如下所示:
public class UserUpdate {
public String Salutation;
public String FirstName;
public String LastName;
}
如果您这样做,将发送的 JSON 将如下所示(请注意 LastName
未序列化,因为它从未设置过 - 这可以通过提供自定义 Gson 改造实例):
{
"Salutation": "Mr",
"FirstName": "Adam"
}
request/response 对象是您通过网络 send/receive 对象的简单 Java 表示。作为补丁请求,您可以让您的成员变量 Integer
、Boolean
等,如果未设置它们将不会被序列化(即如果它们是 null
)。
好的!感谢@Adam 和所有帮助我走向正确方向的人。真的很感激。所以,这就是我最终做的事情(我几乎没有自定义@Adam 发布的内容,这当然是正确的答案!):
首先,
我的 UserUpdate
class 设置如下:
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;
}
}
然后我设置了 interface class
调用 PatientInfoAPI
:
public interface PatientInfoAPI{
@PATCH("/tables/PatientInformation/{id}")
public void update(@Body UserUpdate updatedDAta, @Path("id") String id,Callback<UserUpdate> response);
}
注意我将 table id 传递给 "PATCH'd",最重要的是我有 @Body
注释,它允许我将数据传递给更新而无需获取错误(我试过没有它但出现错误)
最后进入我的主 Activity:
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());
}
});
我知道也许有些步骤不是很复杂,但对于那些刚开始使用 Retrofit 和 OkHttp 的人来说,最重要的是一直在努力让 PATCH
与 Android 一起工作,这就是解决方案。同样,@Adam 的支持在很大程度上指导了我完成整个过程。 @Adam 是真正回答了这个问题的人——我只是把所有内容放在一起,供那些可能需要查看全貌的人使用。谢谢,@亚当!!!你是摇滚明星!