Java 请求主体为android的HttpGet
我试图通过HttpGet在服务器上发出请求。但在消息体中应该是一个json对象。下面的代码不起作用,因为在正文消息中未在服务器上发送单元id和sercret密钥。我怎么做 JSONObject:Java 请求主体为android的HttpGet,java,android,json,http-get,Java,Android,Json,Http Get,我试图通过HttpGet在服务器上发出请求。但在消息体中应该是一个json对象。下面的代码不起作用,因为在正文消息中未在服务器上发送单元id和sercret密钥。我怎么做 JSONObject: { "unit_id": 12345, "secret_key": "sdfadfsa6as987654754" } 我的代码: private HttpResponse makeRequest(int id, String secretKey) throws Exception { Basi
{
"unit_id": 12345,
"secret_key": "sdfadfsa6as987654754"
}
我的代码:
private HttpResponse makeRequest(int id, String secretKey) throws Exception {
BasicHttpParams params = new BasicHttpParams();
params.setParameter("id", id);
params.setParameter("secret_key", secretKey);
httpget.setHeader("Accept", "application/json");
httpget.setParams(params);
httpget.setHeader("Content-type", "application/json");
// Handles what is returned from the page
return httpclient.execute(httpget);
}
编辑:在php中,此请求如下所示
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://0101.apiary.io/api/reservations/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{\n \"unit_id\": 12345,\n \"secret_key\": \"sdfadfsa6as987654754\"\n}");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($ch);
curl_close($ch);
var_dump($response);
如果您想要将JSON对象添加到您的请求中,它必须是Post请求,这就是您执行它的方式:
public static String sendComment (String commentString, int taskId, String sessionId, int displayType, String url) throws Exception{
//creating map object to creat Json object from it
Map<String, Object> jsonValues = new HashMap<String, Object>();
jsonValues.put("sessionID", sessionId);
jsonValues.put("NewTaskComment", commentString);
jsonValues.put("TaskID" , taskId);
jsonValues.put("DisplayType" , displayType);
JSONObject json = new JSONObject(jsonValues);
//creating a post request.
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url + SEND_COMMENT_ACTION);
//setting json object to post request.
AbstractHttpEntity entity = new ByteArrayEntity(json.toString().getBytes("UTF8"));
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(entity);
//this is your response:
HttpResponse response = client.execute(post);
return getContent(response);
}
publicstaticstringsendcoment(stringcommentstring、inttaskid、stringsessionid、intdisplaytype、stringurl)引发异常{
//创建映射对象以从中创建Json对象
Map jsonValues=newhashmap();
jsonValues.put(“sessionID”,sessionID);
put(“NewTaskComment”,commentString);
jsonValues.put(“TaskID”,TaskID);
put(“DisplayType”,DisplayType);
JSONObject json=新的JSONObject(jsonValues);
//创建post请求。
DefaultHttpClient=新的DefaultHttpClient();
HttpPost=新的HttpPost(url+发送注释\操作);
//将json对象设置为post请求。
AbstractHttpEntity=newbyteArrayEntity(json.toString().getBytes(“UTF8”);
setContentType(新的BasicHeader(HTTP.CONTENT_TYPE,“application/json”);
后设实体(实体);
//这是你的回答:
HttpResponse response=client.execute(post);
返回getContent(响应);
}
这是一个很好的例子,说明了如何做到这一点
但我认为这种方法不利于RESTFUL api 基本上,您不能使用HTTP/GET请求发送正文中的行数据(JSON或任何内容)该协议根本不允许您这样做。显然,您也必须在Android中使用POST这样做。:)
更新
我错了。事实上,该协议允许您将实体放入请求对象中。这个类可以代替ApacheHttpGet
public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
public HttpGetWithEntity() {
super();
}
public HttpGetWithEntity(URI uri) {
super();
setURI(uri);
}
public HttpGetWithEntity(String uri) {
super();
setURI(URI.create(uri));
}
@Override
public String getMethod() {
return HttpGet.METHOD_NAME;
}
}
使用方法如下:
HttpClient client = new DefaultHttpClient();
HttpGetWithEntity myGet = new HttpGetWithEntity("Url here");
myGet.setEntity(new StringEntity("This is the body", "UTF8"));
HttpResponse response = client.execute(myGet);
找到了HttpGetWithEntity
的源您似乎没有为请求设置url。我在服务器上尝试了这段代码,结果是400,因为我没有设置消息正文。根据定义,GET=>No request body必须以某种方式完成。上面的php代码运行良好,所以我希望它也可以在android的java中完成。如果我尝试将其更改为httpost,则不允许从服务器响应405方法。@Emil Adz对我的问题有任何想法吗?它与rx2androidnetworking几乎相似:在发送put请求时,允许设置原始主体。使用针对chrome的REST控制台扩展进行了测试:我已经清楚地提到,使用GET是不可能的。我一点也不记得我说过关于PUT的事是我的错。但是对于GET请求也是可能的。@SubinSebastian对我的问题有什么想法吗?它与rx2androidnetworking几乎相似,但是: