Как сделать HTTPPost-вызов с json-кодированным телом?
Я использую следующий код для вызова httpPost, но он возвращает мне 400 плохих запросов
когда я пытаюсь дать следующие параметры в "простом клиенте для отдыха" в chrome extension, он отлично работает, кто-нибудь подскажет мне, какую ошибку я здесь делаю?
Простой клиент для отдыха Я ввел следующее:
URL: http://jon2012.com/api/register
Метод: POST
Заголовки: нет заголовков, поскольку они не требуются.
Данные: { "email": "[email protected]", "first_name": "Name" } ![enter image description here]()
Код Android:
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
HttpResponse response;
JSONObject json = new JSONObject();
try{
HttpPost post = new HttpPost(url);
json.put("email", email);
json.put("first_name", name);
StringEntity se = new StringEntity( "JSON: " + json.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/*Checking response */
/*if(response!=null){
InputStream in = response.getEntity().getContent(); //Get the data in the entity
*/
int statusCode = response.getStatusLine().getStatusCode();
}
catch(Exception e){
e.printStackTrace();
// createDialog("Error", "Cannot Estabilish Connection");
}
любая помощь будет назначена
Ответы
Ответ 1
Я делал общую ошибку, когда ошибка json-объекта была неправильной.
например, я отправлял его как
first_name, email..etc..where, когда правильная последовательность была электронной почтой, first_name
мой код
boolean result = false;
HttpClient hc = new DefaultHttpClient();
String message;
HttpPost p = new HttpPost(url);
JSONObject object = new JSONObject();
try {
object.put("updates", updates);
object.put("mobile", mobile);
object.put("last_name", lastname);
object.put("first_name", firstname);
object.put("email", email);
} catch (Exception ex) {
}
try {
message = object.toString();
p.setEntity(new StringEntity(message, "UTF8"));
p.setHeader("Content-type", "application/json");
HttpResponse resp = hc.execute(p);
if (resp != null) {
if (resp.getStatusLine().getStatusCode() == 204)
result = true;
}
Log.d("Status line", "" + resp.getStatusLine().getStatusCode());
} catch (Exception e) {
e.printStackTrace();
}
return result;
Ответ 2
Здесь мой код для вызова служб отдыха с Http POST и JSON:
(Обратите внимание, что я использую AndroidHttpClient, который в основном является DefaultHttpClient с некоторыми предустановленными атрибутами и проектом Google GSON для сортировки JSON)
Класс для обработки сообщений:
public class NetworkComm extends AsyncTask<String, Integer, String> {
// Log tag
private static final String TAG = "NetworkComm";
private AndroidHttpClient hc;
private HttpContext localContext;
private TaskResponseListener listener;
private int reqType;
private String message;
private String url;
private Object extra;
public NetworkComm(AndroidHttpClient hc, HttpContext localContext, TaskResponseListener listener,
int reqType, String message, String url, Object extra){
super();
this.hc = hc;
this.localContext = localContext;
this.listener = listener;
this.reqType = reqType;
this.message = message;
this.url = url;
this.extra = extra;
}
public AndroidHttpClient getHc() {
return hc;
}
public void setHc(AndroidHttpClient hc) {
this.hc = hc;
}
public HttpContext getLocalContext() {
return localContext;
}
public void setLocalContext(HttpContext localContext) {
this.localContext = localContext;
}
public void start(){
this.execute(message);
}
protected void onPreExecute() {
//Don't do anything here
}
protected String doInBackground(String... req) {
Log.d(TAG, "Message to send: "+req[0]);
HttpPost p = new HttpPost(url);
try{
p.setEntity(new StringEntity(req[0], "UTF8"));
}catch(Exception e){
e.printStackTrace();
}
p.setHeader("Content-type", "application/json");
String response = "";
try{
HttpResponse resp = hc.execute(p, localContext);
InputStream is = resp.getEntity().getContent();
response = convertStreamToString(is);
Log.d("Response", "Response is " + response);
Log.d("Status line", ""+resp.getStatusLine().getStatusCode());
} catch (Exception e){
e.printStackTrace();
}
return response;
}
protected void onProgressUpdate(Integer... progress) {
// dont handle this yet
}
@Override
protected void onCancelled() {
super.onCancelled();
}
protected void onPostExecute(String result) {
Log.d("task", "task finished");
listener.onTaskResponse(reqType, result, extra);
}
public interface TaskResponseListener{
public void onTaskResponse(int type, String response, Object extra);
}
private String convertStreamToString(InputStream is) throws IOException {
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(
new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}
}
Использование:
Gson g = new Gson();
SomeContent content = new SomeContent("Stuff", 4);
String message = g.toJson(content);
NetworkComm task = new NetworkComm(hc, localContext, listener, 0, message, url, "");
task.start();
Надеюсь, что это поможет.