“HttpDeleteWithBody”未从数据库中删除

时间:2015-05-02 21:24:00

标签: android json

我正在尝试致电我的API向我的数据库发送JSON 删除 产品; 但是,它不会删除任何内容。

JSON的回答是“真的”,并没有给我任何错误;即便如此,当我对我的数据库进行查询时,产品仍在那里。

我创建了一个名为HttpDeleteWithBody的类,如下所示:

class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
    public static final String METHOD_NAME = "DELETE";
    public String getMethod() { return METHOD_NAME; }

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

然后在我doInBackGround的{​​{1}}上,我这样做:

Fragment

此外,我试图这样做:

boolean resul = true;
try {
    JSONObject usuari = new JSONObject();
    try {
        usuari.put("idProducte", params[0]);
        usuari.put("idusuari", params[1]);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        HttpEntity entity = new StringEntity(usuari.toString());
        HttpClient httpClient = new DefaultHttpClient();
        HttpDeleteWithBody httpDeleteWithBody = new HttpDeleteWithBody(getResources().getString(R.string.IPAPI) + "produsuaris/produsuari");
        httpDeleteWithBody.setEntity(entity);

        HttpResponse response = httpClient.execute(httpDeleteWithBody);
        Log.d("Response ---------->", response.getStatusLine().toString());
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (Exception ex) {
    Log.e("ServicioRest", "Error!", ex);
}
return resul;

然而,它不起作用......日志说:

  

D / Response ---------->:HTTP / 1.1 200 OK

这就是我调用方法的方法:

HttpDeleteWithBody delete = new HttpDeleteWithBody(getResources().getString(R.string.IPAPI) + "produsuaris/produsuari");
StringEntity se = new StringEntity(usuari.toString(), HTTP.UTF_8);
se.setContentType("application/json");

delete.setEntity(se);

我在谷歌浏览器上添加了一个名为PostMan 的插件,当我尝试通过这种方式执行此操作时,它正在删除正确...

Figure 1

我做错了什么?

修改

我尝试使用JSONObject deleteproduct = new JSONObject(); try { deleteproduct.put("idProducte", String.valueOf(IDPROD)); deleteproduct.put("idusuari", String.valueOf(IDUSU)); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i("Json test per afegir prod --> ", deleteproduct.toString()); TareaWSInsertar tarea = new TareaWSInsertar(); tarea.execute(String.valueOf(IDPROD), String.valueOf(IDUSU)); ,结果就是这样:

Figure 2

当我将cURLJSON放在一起时,它会让我失意。尽管如此,如果我在PostMan上添加相同的JSON,则可以正常使用。

编辑2

我实施了ion library,我就这样做了:

PostMan

它仍然返回它没关系,并且不删除任何东西。

2 个答案:

答案 0 :(得分:1)

这似乎是服务器方面的问题,为了确保这一点,请执行以下操作: 1)在你的祖母中加入Ion作为依赖。

compile 'com.koushikdutta.ion:ion:+'

2)使用以下代码段来执行您的请求:

JSONObject jsonObject = new JSONObject();
    try{
        for(BasicNameValuePair aNameValue : getParameters()){

            jsonObject.put(aNameValue.getName(), aNameValue.getValue());
            Log.d("TEST","parameter "+aNameValue.getName()+": "+aNameValue.getValue());

        }
        jsonObject.put("time_zone", Util.timeZone());
        Log.d("TEST","parameter time_zone:"+Util.timeZone());
    }catch(Exception e){
        //
    }

    Log.d("CURL", "curl -X DELETE -d '"+jsonObject.toString()+"' "+getUrl());

    Builders.Any.F builder = Ion.with(getContext())
            .load(HttpDelete.METHOD_NAME, getUrl())
            .setTimeout(BuildConfig.HttpClientMaxTimeout).setStringBody(jsonObject.toString());

    String response = builder.asString().get();
    Util.checkThreadUiException();
    Log.d("TEST","-->"+ response);

没有太多火箭科学,这是我在应用程序中使用的代码,在该方法中,我收到了作为json发送的参数,作为BasicNameValuePair集合。您可以更改它并直接设置您的json。我百分之百肯定这个请求会失败,因为这是服务器方面的问题。

<强>更新

JSONObject usuari = new JSONObject();
    try {
        usuari.put("idProducte", params[0]);
        usuari.put("idusuari", params[1]);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String url = getResources().getString(R.string.IPAPI) + "produsuaris/produsuari";
    Log.d("CURL", "curl -X DELETE -d '"+usuari.toString()+"' "+url);

    Builders.Any.F builder = Ion.with(getContext())
            .load(HttpDelete.METHOD_NAME, url)
            .setTimeout(BuildConfig.HttpClientMaxTimeout).setStringBody(usuari.toString());

    String response = builder.asString().get();
    Log.d("TEST","Req response -->"+ response)

<强>更新

试试这个,通过curl执行此请求并让我知道结果:

curl --http1.0 -X DELETE -d '{"idusuari":121,"idProducte":15}' 192.168.1.46/ServicioWebRest/api/produsuaris/produsuari

执行此操作即可告知curl通过http 1.0发送请求,只有http 1.1支持分块响应,如果块编码中出现错误,这应该告诉您。

另请查看我很久以前提交给Ion的issue。我认为那个时候我遇到的问题和你当前的问题是相似的,也许有些技巧会有所帮助。特别是关于addHeader("Connection", "close")

的部分

看起来像这样:

 Builders.Any.F builder = Ion.with(getContext())
            .addHeader("Connection", "close")
            .load(HttpDelete.METHOD_NAME, getUrl())
            .setTimeout(BuildConfig.HttpClientMaxTimeout).setStringBody(jsonObject.toString());

答案 1 :(得分:0)

最后我解决了问题,我所做的就是更改HttpDelete上的API方法,而不是发送JSON,我发送参数(如HttpGet)现在我的代码就像:

   boolean resul = true;

        HttpClient httpClient = new DefaultHttpClient();

        String id____USER = params[0];
        String id____PROD = params[1];

        HttpDelete del =
                new HttpDelete(getResources().getString(R.string.IPAPI) + "produsuaris/produsuari?idProd=" + Integer.parseInt(id____PROD)+"&idUs="+Integer.parseInt(id____USER));

        del.setHeader("content-type", "application/json");

        try
        {
            HttpResponse resp = httpClient.execute(del);
            String respStr = EntityUtils.toString(resp.getEntity());

            if(!respStr.equals("true"))
                resul = false;
        }
        catch(Exception ex)
        {
            Log.e("ServicioRest","Error!", ex);
            resul = false;
        }

        return resul;

我称之为AsyncMethod

  TareaWSInsertar tarea = new TareaWSInsertar();
                                tarea.execute(String.valueOf(IDUSU),String.valueOf(IDPROD));

这项工作对我来说,我知道它不是最好的解决方案,但我没有多少时间,我也尝试了三种解决方案,没有人没有工作。

如果你知道我做错了什么,请随意发一个正确答案。