如何将JSON对象流式传输到HttpURLConnection POST请求

我看不出这段代码有什么问题:

JSONObject msg; //passed in as a parameter to this method HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); httpCon.setDoOutput(true); httpCon.setDoInput(true); httpCon.setUseCaches(false); httpCon.setRequestProperty( "Content-Type", "application/json" ); httpCon.setRequestProperty("Accept", "application/json"); httpCon.setRequestMethod("POST"); OutputStream os = httpCon.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8"); msg.write(osw); osw.flush(); osw.close(); os.close(); //probably overkill 

在服务器上,我根本没有发布post内容,零长度字符串。

尝试

 ... httpCon.setRequestMethod("POST"); httpCon.connect(); // Note the connect() here ... OutputStream os = httpCon.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8"); ... osw.write(msg.toString()); osw.flush(); osw.close(); 

发送数据。

检索数据尝试:

 BufferedReader br = new BufferedReader(new InputStreamReader( httpCon.getInputStream(),"utf-8")); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); System.out.println(""+sb.toString()); 

HttpURLConnection使用起来很麻烦。 使用David Webb ,一个围绕HttpURLConnection的小包装器,您可以这样写:

 JSONObject msg; //passed in as a parameter to this method Webb webb = Webb.create(); JSONObject result = webb.post("http://my-url/path/to/res") .useCaches(false) .body(msg) .ensureSuccess() .asJsonObject() .getBody(); 

如果您不喜欢它,则提供的链接上有一个替代库列表。

为什么我们每天都要编写相同的样板代码? 顺便说一句,上面的代码更易读,更不容易出错。 HttpURLConnection有一个糟糕的界面。 这必须包裹!

  public String sendHTTPData(String urlpath, JSONObject json) { HttpURLConnection connection = null; try { URL url=new URL(urlpath); connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); OutputStreamWriter streamWriter = new OutputStreamWriter(connection.getOutputStream()); streamWriter.write(json.toString()); streamWriter.flush(); StringBuilder stringBuilder = new StringBuilder(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK){ InputStreamReader streamReader = new InputStreamReader(connection.getInputStream()); BufferedReader bufferedReader = new BufferedReader(streamReader); String response = null; while ((response = bufferedReader.readLine()) != null) { stringBuilder.append(response + "\n"); } bufferedReader.close(); Log.d("test", stringBuilder.toString()); return stringBuilder.toString(); } else { Log.e("test", connection.getResponseMessage()); return null; } } catch (Exception exception){ Log.e("test", exception.toString()); return null; } finally { if (connection != null){ connection.disconnect(); } } }` 

在asynctask中的doitbackground中调用此methopd

请遵循以下示例:

 public static PricesResponse getResponse(EventRequestRaw request) { // String urlParameters = "param1=a&param2=b&param3=c"; String urlParameters = Piping.serialize(request); HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters); PricesResponse response = null; try { // POST OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(urlParameters); writer.flush(); // RESPONSE BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8)); String json = Buffering.getString(reader); response = (PricesResponse) Piping.deserialize(json, PricesResponse.class); writer.close(); reader.close(); } catch (Exception e) { e.printStackTrace(); } conn.disconnect(); System.out.println("PricesClient: " + response.toString()); return response; } public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) { return RestClient.getConnection(endPoint, "POST", urlParameters); } public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) { System.out.println("ENDPOINT " + endPoint + " METHOD " + method); HttpURLConnection conn = null; try { URL url = new URL(endPoint); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod(method); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "text/plain"); } catch (IOException e) { e.printStackTrace(); } return conn; } 

这没有json String将数据发布到服务器

  class PostLogin extends AsyncTask { @Override protected String doInBackground(Void... params) { String response = null; Uri.Builder builder= new Uri.Builder().appendQueryParameter("username","amit").appendQueryParameter("password", "amit"); String parm=builder.build().getEncodedQuery(); try { response = postData("your url here/",parm); }catch (Exception e) { e.printStackTrace(); } Log.d("test", "response string is:" + response); return response; } } private String postData(String path, String param)throws IOException { StringBuffer response = null; URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // connection.setRequestProperty("Content-Type", "application/json"); // connection.setRequestProperty("Accept", "application/json"); OutputStream out = connection.getOutputStream(); out.write(param.getBytes()); out.flush(); out.close(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; response = new StringBuffer(); while ((line = br.readLine()) != null) { response.append(line); } br.close(); } return response.toString(); }