Android HttpPut到Django REST Framework - 数据不更新

时间:2014-11-19 19:10:33

标签: android django django-rest-framework

有没有人有关于从Android到Django REST Framework的PUT请求的建议?当我将下面的代码发布到我的API端点,指定要更新的记录(例如http://mydomain/api/26)时,我得到状态代码为200的响应和目标记录的json内容,但没有任何内容已经过由请求更新。相反,当我通过Postman或通过可浏览的API制作看似相同的请求时,它工作正常,给我200响应和更新的json内容。同样,我可以使用几乎相同的Android代码向API发出POST请求,没有任何问题。任何想法都会很精彩。感谢。

public static HttpResponse putJsonString(String jsonString, String targetUrl, Context context){
    HttpResponse result = null;
    try {
        HttpParams httpParameters = new BasicHttpParams();
        int timeoutConnection = 3000;
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        int timeoutSocket = 3000;
        HttpConnectionParams
                .setSoTimeout(httpParameters, timeoutSocket);

        DefaultHttpClient httpclient = new DefaultHttpClient(
                httpParameters);
        HttpPut httpPut = new HttpPut(targetUrl);
        StringEntity se = new StringEntity(jsonString, "UTF-8");
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                "application/json"));
        httpPut.setEntity(se);
        httpPut.setHeader("Accept", "application/json");
        httpPut.setHeader("Content-type", "application/json");
        httpPut.setHeader("Authorization", "Token " + PropertyHolder.getUserKey());
        Log.d("put", "put content: " + parseInputStream(context, httpPut.getEntity().getContent()));
        result = httpclient.execute(httpPut);
    } catch (UnsupportedEncodingException e) {
        Util.logError(context, TAG, "error: " + e);
    } catch (ClientProtocolException e) {
        Util.logError(context, TAG, "error: " + e);
    } catch (IOException e) {
        Util.logError(context, TAG, "error: " + e);
    }
    return result;
}

1 个答案:

答案 0 :(得分:0)

解决方案似乎比我想象的更简单:确保目标URL中有一个尾部斜杠。所以http://mydomain/api/26/代替http://mydomain/api/26。从Postman发送PUT请求时似乎并不重要,但是从Android中省略尾部斜杠似乎会导致请求被重定向,并且在此过程中它将变为GET。我认为潜在的问题是Apache HTTP客户端如何处理重定向,并且明确设置它也可能是值得的,但是现在只需添加斜杠即可。