Android 使用异步任务发送带参数的json请求

Android 使用异步任务发送带参数的json请求,android,json,rest,android-asynctask,Android,Json,Rest,Android Asynctask,我正试图向服务器发送一个带有一些参数的json请求。请求正在进行,异步任务工作正常,但它在服务器上引发异常,并表示url无效 这就是我正在做的 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); Button btnChart = (Button) findViewBy

我正试图向服务器发送一个带有一些参数的json请求。请求正在进行,异步任务工作正常,但它在服务器上引发异常,并表示url无效

这就是我正在做的

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);   

    Button btnChart = (Button) findViewById(R.id.btn_chart);

    // Defining click event listener for the button btn_chart
    OnClickListener clickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            new HttpAsyncTask().execute("https://tt.student.com/back.json");
              }
    };


    // Setting event click listener for the button btn_chart of the MainActivity layout
    btnChart.setOnClickListener(clickListener);
 }

public static String POST(String url){
    InputStream inputStream = null;
    String result = "";
    try {

        // 1. create HttpClient
        HttpClient httpclient = getNewHttpClient();

        // 2. make POST request to the given URL
        HttpPost httpPost = new HttpPost(url);

        String json = "";

        // 3. build jsonObject
        JSONObject jsonObject = new JSONObject();
        jsonObject.accumulate("user", 1);
        jsonObject.accumulate("student_id", 1);
        jsonObject.accumulate("user_email", "test@test.com");
        jsonObject.accumulate("from", "Fri Oct 10 12:38:00 2014 GMT+0200");
        jsonObject.accumulate("to", "Sat Oct 11 12:38:00 2014 GMT+0200");

        // 4. convert JSONObject to JSON to String
        json = jsonObject.toString();

        // ** Alternative way to convert Person object to JSON string usin Jackson Lib
        // ObjectMapper mapper = new ObjectMapper();
        // json = mapper.writeValueAsString(person);

        // 5. set json to StringEntity
        StringEntity se = new StringEntity(json);

        // 6. set httpPost Entity
        httpPost.setEntity(se);

        // 7. Set some headers to inform server about the type of the content
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");

        // 8. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPost);

        // 9. receive response as inputStream
        inputStream = httpResponse.getEntity().getContent();

        // 10. convert inputstream to string
        if(inputStream != null)
            result = convertInputStreamToString(inputStream);
        else
            result = "Did not work!";

    } catch (Exception e) {
        Log.d("InputStream", e.getLocalizedMessage());
    }

    // 11. return result
    return result;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException{
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
    String line = "";
    String result = "";
    while((line = bufferedReader.readLine()) != null)
        result += line;

    inputStream.close();
    return result;

}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        return POST(urls[0]);
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
        Log.d(TAG,result);
    }
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
按钮btnChart=(按钮)findViewById(R.id.btn\U图表);
//为按钮btn\U图表定义单击事件侦听器
OnClickListener clickListener=新建OnClickListener(){
@凌驾
公共void onClick(视图v){
新建HttpAsyncTask()。执行(“https://tt.student.com/back.json");
}
};
//设置MainActivity布局的按钮btn_图表的事件单击侦听器
btnChart.setOnClickListener(单击Listener);
}
公共静态字符串POST(字符串url){
InputStream InputStream=null;
字符串结果=”;
试一试{
//1.创建HttpClient
HttpClient HttpClient=getNewHttpClient();
//2.向给定URL发出POST请求
HttpPost HttpPost=新的HttpPost(url);
字符串json=“”;
//3.构建jsonObject
JSONObject JSONObject=新的JSONObject();
jsonObject.acculate(“用户”,1);
jsonObject.累加(“学生id”,1);
jsonObject.accumulate(“用户电子邮件”test@test.com");
jsonObject.累加(“自”、“10月10日星期五12:38:00 2014 GMT+0200”);
jsonObject.累加(“至”,“星期六10月11日12:38:00 2014 GMT+0200”);
//4.将JSONObject转换为JSON转换为字符串
json=jsonObject.toString();
//**在Jackson库中将Person对象转换为JSON字符串的替代方法
//ObjectMapper mapper=新的ObjectMapper();
//json=mapper.writeValueAsString(person);
//5.将json设置为StringEntity
StringEntity se=新的StringEntity(json);
//6.设置httpPost实体
httpPost.setEntity(se);
//7.设置一些标题以通知服务器内容的类型
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”、“应用程序/json”);
//8.对给定URL执行POST请求
HttpResponse HttpResponse=httpclient.execute(httpPost);
//9.将响应作为inputStream接收
inputStream=httpResponse.getEntity().getContent();
//10.将inputstream转换为字符串
如果(inputStream!=null)
结果=convertInputStreamToString(inputStream);
其他的
结果=“不起作用!”;
}捕获(例外e){
d(“InputStream”,例如getLocalizedMessage());
}
//11.返回结果
返回结果;
}
私有静态字符串convertInputStreamToString(InputStream InputStream)引发IOException{
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=”;
字符串结果=”;
而((line=bufferedReader.readLine())!=null)
结果+=行;
inputStream.close();
返回结果;
}
私有类HttpAsyncTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
返回帖子(URL[0]);
}
//onPostExecute显示异步任务的结果。
@凌驾
受保护的void onPostExecute(字符串结果){
Toast.makeText(getBaseContext(),“Received!”,Toast.LENGTH_LONG.show();
Log.d(标签、结果);
}
}
在url中,我尝试了两种方法,一种是在上面的代码中,另一种是在url本身中传递参数
https://tt.student.com/back.json?user=1&student_id=1&user=testh@test.com&from=10月10日星期五12:38:00 2014 GMT+0200&to=10月11日星期六12:38:00 2014 GMT+0200

为此,它在url中显示非法字符…

该链接需要一个证书,该证书应为android所信任。可能您可以通过代码接受证书,但您需要该证书。我试图在浏览器中打开,但它显示了不受信任的证书….

我想,问题可能是服务器或Wifi请求状态。您的设备仅连接到wifi,但未通过访问internet的认证,或者更严格地说,未通过从服务器交换数据包的认证

我建议您使用该方法检查设备连接,我认为您的情况也是如此,因为我有类似的状态,我花了将近1-2个小时使其正常工作。 有关internet连接检查,请参见以下链接


我希望这会有所帮助。

您应该使用POST请求,而不是GET请求。在查询字符串中,电子邮件id将被视为无效。GET只是一个方法,但在我执行POST请求的内部,为什么电子邮件会无效?添加服务器端代码,我也无法访问服务器端代码,但我确信它也能正常工作,因为我在web部件中也使用了此服务…尝试使用基本名称-值对作为参数,或者首先尝试使用curl点击url,您将看到确切的错误我添加了获取证书的方法,但没有添加到上述代码中,此外,这不是正确的url只是一个例子,那么你没有提出正确的请求。。。询问创建服务器的人他需要以何种方式请求。。i、 e.他在头球中需要什么,身体应该是什么。。。。您可以看到您正在服务器上发布的请求实体…但当我使用此10月10日12:38:00 2014 GMT+0200&to=Sat 10月11日12:38:00 2014 GMT+0200请求从httpclientin chrome发送请求时,我得到了正确的响应您的请求中是否有空格。。如果在日期之间有替换为%20是,我有空间…是的,你会得到,因为这不是真实的url只是一个例子是的,是的,是这样的,有点晚了,但我接受它,因为它是正确的答案。谢谢你