我正在尝试致电我的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” 的插件,当我尝试通过这种方式执行此操作时,它正在删除正确...
我做错了什么?
我尝试使用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));
,结果就是这样:
当我将cURL
与JSON
放在一起时,它会让我失意。尽管如此,如果我在PostMan
上添加相同的JSON
,则可以正常使用。
我实施了ion library,我就这样做了:
PostMan
它仍然返回它没关系,并且不删除任何东西。
答案 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));
这项工作对我来说,我知道它不是最好的解决方案,但我没有多少时间,我也尝试了三种解决方案,没有人没有工作。
如果你知道我做错了什么,请随意发一个正确答案。