有没有推荐的方法在android中进行发布请求?因为在我使用HttpClient
和class ExtendedLoginForm(LoginForm):
name = TextField('User Name:', [Required()])
del LoginForm.email
security = Security(app, user_datastore, login_form=ExtendedLoginForm)
执行post请求之前,这些类现在已在API级别22中弃用。
答案 0 :(得分:0)
您可以使用HttpURLConnection
public String makeRequest(String pageURL, String params)
{
String result = null;
String finalURL =pageURL;
Logger.i("postURL", finalURL);
Logger.i("data", params);
try {
URL url = new URL(finalURL);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
urlConnection.setRequestProperty("Accept", "application/json");
OutputStream os = urlConnection.getOutputStream();
os.write(params.getBytes("UTF-8"));
os.close();
int HttpResultCode =urlConnection.getResponseCode();
if(HttpResultCode ==HttpURLConnection.HTTP_OK){
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
result = convertStreamToString(in);
Logger.i("API POST RESPONSE",result);
}else{
Logger.e("Error in response ", "HTTP Error Code "+HttpResultCode +" : "+urlConnection.getResponseMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
然后将您的信息流转换为字符串
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
创建您的JSON
JSONObject j=new JSONObject();
try {
j.put("name","hello");
j.put("email","hello@gmail.com");
} catch (JSONException e) {
e.printStackTrace();
}
//Call the method
makeRequest("www.url.com",j.toString());
答案 1 :(得分:0)
是的,他们被弃用了。您可以使用Google Dev推荐的Volley。
Volley提供以下好处: 自动调度网络请求。 多个并发网络连接。 具有标准HTTP缓存一致性的透明磁盘和内存响应缓存。 支持请求优先级。 取消请求API。您可以取消单个请求,也可以设置要取消的请求块或范围。 易于定制,例如,重试和退避。 强大的排序功能,可以使用从网络异步获取的数据轻松正确地填充UI。
Volley很容易使用:
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
答案 2 :(得分:0)
只是为了展示另一个可以帮助您的库:OkHttp
来自他们网站的示例帖子:
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
或Retrofit。
您基本上创建了一个接口,其中包含有关您正在调用的其余API和参数的注释,并且可以接收解析的json模型,如下所示:
public interface MyService {
@POST("/api")
void createTask(@Body CustomObject o, Callback<CustomObject > cb);
}
你可以同时设置它们,这是一个对我有很大帮助的指南:https://futurestud.io/blog/retrofit-getting-started-and-android-client/
尽管这不是谷歌文档中推荐的官方方式,但这些都是很好的库,值得一看。