我正在使用必须通过post方法发送用户电子邮件的android应用程序。当我已经运行了一些测试并且能够从此处获取值时,api端点位于https://api-iddog.idwall.co/。我正在使用Loopj库。
但是,我的任务是使用此端点:
https://api-iddog.idwall.co/signup
文档指南显示我需要使用以下参数来构造POST方法:
使用Content-Type: application/json
标头
,发布网址应类似于:
考虑到所有这些,我创建了一个名为attempPost()
的方法。通过这种方法,我创建了AsyncHttpRequest
对象,RequestParams
对象并存储了用户键入的有效电子邮件。
private void attempPost() {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
String url = "https://api-iddog.idwall.co/signup";
String userEmail = userEmailView.getText().toString();
JSONObject jsonEmail = new JSONObject();
try {
jsonEmail.put("email", userEmail);
} catch (JSONException e) {
e.printStackTrace();
}
Log.d("Dog", " " + jsonEmail.toString());
params.put("-d", jsonEmail);
client.addHeader("Content-Type", "application/json");
client.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Log.d("Dog", "onSucess" + responseBody.toString());
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e("Dog", "" + error.toString());
}
});
}
此方法在OnclickListener
中被调用,并且日志返回一条称为BadRequest和状态代码400的消息。我已经尝试应用Loopj文档中的一些代码示例,但是我没有工作。有人可以让我了解我做错了什么吗?从我可以收集的内容来看,成功响应应该是String(Token),我需要此令牌来完成项目。
编辑。
我在Stack上的文档和其他示例中做了很多工作,发现了这一点:POSTing JSON/XML using android-async-http (loopj)
在接受的答案中,有一个有关如何发布JSON的示例。
然后,我对attempPost方法进行了一些更改。
private void attempPost() {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
String url = "https://api-iddog.idwall.co/signup";
String userEmail = userEmailView.getText().toString();
JSONObject jsonParams = new JSONObject();
try {
jsonParams.put("email", "your@email.com");
} catch (JSONException e) {
e.printStackTrace();
}
client.post(getApplicationContext(), url, jsonParams, "application/json", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Log.d("Dog", "onSucess" + responseBody.toString());
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e("Dog", "" + error.toString());
Log.e("Dog", "status code " + String.valueOf(statusCode));
}
});
}
但是Android Studio告诉我将jsonParams转换为实体。在我从堆栈中获得的示例中,它使用以下代码来实现这一目标:
StringEntity entity = new StringEntity(jsonParams.toString());
但是我的android studio感到恐怖:
未处理的异常:java.io.UnsupportedEncodingException,
直到现在,我还没有找到解决这个问题的方法。
答案 0 :(得分:0)
我设法使其正常工作,API现在返回了正确的响应和状态码200。由于StringEntity不是一个选项,因此我将JsonObject转换为ByteArrayEntity。
private void attempPost() {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
String userEmail = userEmailView.getText().toString();
JSONObject jsonParams = new JSONObject();
try {
jsonParams.put("email", userEmail);
} catch (JSONException e) {
e.printStackTrace();
}
ByteArrayEntity be = new ByteArrayEntity(jsonParams.toString().getBytes());
//TODO create a class to handle JSON post, getmethods and parse token value
client.post(getApplicationContext(), API_URL, be, "application/json", new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
Log.d("Dog", "onSucess " + response.toString());
Log.d("Dog", "status code " + String.valueOf(statusCode));
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Log.e("Dog", "" + errorResponse.toString());
Log.e("Dog", "status code " + String.valueOf(statusCode));
}
});
}