从Android向服务器发送数据不工作

从Android向服务器发送数据不工作,android,spring,spring-mvc,Android,Spring,Spring Mvc,从android,我想把学生的详细信息作为json字符串发送到服务器。 因此,我:- String url1 = "http://my ipaddress/AndroidProject/details"; List<Pair<String, String>> pairs = new ArrayList<>(); pairs.add(new Pair<>("details", JsonString)); URL url = new URL(url

从android,我想把学生的详细信息作为json字符串发送到服务器。 因此,我:-

String url1 = "http://my ipaddress/AndroidProject/details";

List<Pair<String, String>> pairs = new ArrayList<>();
pairs.add(new Pair<>("details", JsonString));

URL url = new URL(url1);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST"); 
conn.setDoInput(true); 
conn.setDoOutput(true); 

// POST the signup
try {
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8"));       
writer.write(pairs.toString());
writer.flush(); 
writer.close(); 
os.close(); 
conn.connect(); 
} 
catch (IOException ioe) {

//error display

}
字符串url1=”http://my ipaddress/AndroidProject/details”;
列表对=新的ArrayList();
添加(新对(“详细信息”,JsonString));
URL=新URL(url1);
HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
conn.setRequestMethod(“POST”);
conn.setDoInput(真);
连接设置输出(真);
//张贴注册
试一试{
OutputStream os=conn.getOutputStream();
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(os,“UTF-8”));
writer.write(pairs.toString());
writer.flush();
writer.close();
os.close();
连接();
} 
捕获(ioe异常ioe){
//错误显示
}
而且,为了你,我有

@RequestMapping(value = "/details", method = RequestMethod.POST, produces = "application/json")
    public ResponseEntity<Object> processUserdetails(HttpServletRequest request, HttpServletResponse response,
            @RequestParam(value = "details", required = true) final String studentDetail) {

        logger.info("Mobile Student Signup > Message received: " + studentDetail);
}
@RequestMapping(value=“/details”,method=RequestMethod.POST,products=“application/json”)
public ResponseEntity processUserdetails(HttpServletRequest请求、HttpServletResponse响应、,
@RequestParam(value=“details”,required=true)最终字符串studentDetail){
logger.info(“移动学生注册>收到信息:“+studentDetail”);
}
但是服务器没有收到任何数据。为什么???

请尝试使用以下方法:

//Activity Class variable
StringBuilder sb;   //don't forget to initialize it!

private class RegisterDevice extends AsyncTask<String,String,String>{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {
        try {

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("FirstField", FirstValue));
            nameValuePairs.add(new BasicNameValuePair("SecondField", SecondValue));

            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();

            HttpPost httpPost = new HttpPost(UrlHandler.vRegisterDevice);
            httpPost.setHeader(HTTP.CONTENT_TYPE,"application/x-www-form-urlencoded;charset=UTF-8");
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));

            HttpResponse response = httpClient.execute(httpPost);

            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
            String sResponse;
            //Log.e("Response: ", "" + reader.readLine());
            if (sb != null) {
                sb = null;
                sb = new StringBuilder();
            }

            while ((sResponse = reader.readLine()) != null) {
                sb = sb.append(sResponse);
            }

            Log.i("Test","doInBackground: " + sb.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
            Log.d("Test","onPostExecute - Register Device");
            String vResult = "";
            if(sb != null)
                vResult = sb.toString();

            Log.d("Result String ",vResult);
            if (vResult.contains("Success")) {//success
                Intent intent = new Intent(CurrentAtivity.this,TargetActivity.class);
                startActivity(intent);

                //Hide the progress bar as the task done
                ProgressBar.setVisibility(View.GONE);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}
//活动类变量
为某人做准备//别忘了初始化它!
私有类RegisterDevice扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串背景(字符串…字符串){
试一试{
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“FirstField”,FirstValue));
添加(新的BasicNameValuePair(“SecondField”,SecondValue));
HttpClient HttpClient=新的DefaultHttpClient();
HttpContext localContext=新的BasicHttpContext();
HttpPost HttpPost=新的HttpPost(UrlHandler.vRegisterDevice);
setHeader(HTTP.CONTENT_TYPE,“application/x-www-form-urlencoded;charset=UTF-8”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs,“UTF-8”);
HttpResponse response=httpClient.execute(httpPost);
BufferedReader=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent(),“UTF-8”);
字符串响应;
//Log.e(“响应:”,“+reader.readLine());
如果(sb!=null){
sb=null;
sb=新的StringBuilder();
}
而((sResponse=reader.readLine())!=null){
sb=sb.追加(响应);
}
Log.i(“Test”,“doInBackground:+sb.toString());
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
试一试{
d(“测试”,“onPostExecute-寄存器设备”);
字符串vResult=“”;
如果(sb!=null)
vResult=sb.toString();
Log.d(“结果字符串”,vResult);
if(vResult.contains(“Success”){//Success
意向意向=新意向(currentivity.this,TargetActivity.class);
星触觉(意向);
//在任务完成时隐藏进度条
ProgressBar.setVisibility(View.GONE);
}
}捕获(例外情况除外){
例如printStackTrace();
}
}
}

这是我对web服务使用openConnection方法的方式。这是使用get方法,但您可以相应地更改它

 @Override
    protected Integer doInBackground(String... params) {

        InputStream inputStream = null;

        HttpURLConnection urlConnection = null;

        Integer result = 0;
        try {
            /* forming th java.net.URL object */
            URL url = new URL(params[0]);
            //String mobileNo = mobileno.getText().toString();
            urlConnection = (HttpURLConnection) url.openConnection();

             /* optional request header */
            urlConnection.setRequestProperty("Content-Type", "application/json");

            /* optional request header */
            urlConnection.setRequestProperty("Accept", "application/json");

            /* for Get request */
            urlConnection.setRequestMethod("GET");

            int statusCode = urlConnection.getResponseCode();

            /* 200 represents HTTP OK */
            if (statusCode == 200) {

                inputStream = new BufferedInputStream(urlConnection.getInputStream());

                response = convertInputStreamToString(inputStream);



                result = 1; // Successful

                System.out.println(response);
            } else {
                result = 0; //"Failed to fetch data!";

            }

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

        return result; //"Failed to fetch data!";
    }
这就是convertInputStream方法

private 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;
}
这就是我传递url的方式

 JOBCOMPLETE_URL=Baseurl + "job_complete.php?cid="+userid;
    CompletedJobAsyncTask completedJobAsyncTask=new CompletedJobAsyncTask();
    completedJobAsyncTask.execute(JOBCOMPLETE_URL);

我已经完成了这个代码。这是可行的…但在android 6.0中,BasicNameValuePair、nameValuePairs、DefaultHttpClient都被弃用了…这就是我想尝试使用HttpsURLConnection的原因。最有可能的是,android 6.0+中的运行时权限可能在其中起到了作用。您可能想尝试添加它们。有很多问题可以帮你解决。这里有一个来自Android开发人员的参考:您要发送的数据在哪里?我正在使用web服务的get方法,所以参数会附加url