【发布时间】:2015-03-25 13:27:22
【问题描述】:
我知道类似的问题已经被问过好几次了,但我似乎找不到一个简单问题的解决方案:PATCH动词。
所以我问任何通过使用 OkHttp、Volley 或 Retrofit 解决了 Android 中 PATCH 问题的人(或者如果您使用了不同的方法或库,请分享)。
我花了 3 天时间四处挖掘,但找不到任何解决此问题的方法。我要做的就是通过在 .NET 环境中构建和运行的 RESTful API 对表进行部分更新。
我目前正在使用 Volley,但每次运行该应用程序时,我都会收到异常错误,说明类似于 PATCH is not an allowed...? 的内容,然后它给出了一系列可以使用的其他动词,例如“POST,放,拿……”。所以,一点帮助都没有。
我尝试过像这样使用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”工作有任何建议和想法,我将永远感激你。
感谢您的帮助。
【问题讨论】:
-
您在
.patch()之后错过了对.build()的呼叫。你想要Request,而不是Request.Builder。 -
您是否尝试过使用像 Rested 这样的 REST 客户端(众多 chrome 扩展程序之一等)来确保您的服务器支持请求?
-
@JacobTabak,是的,我有。一切正常,除非我尝试在 Android 中做同样的事情。
标签: android android-volley okhttp