有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将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

在服务器上,我没有收到任何帖子内容,一个零长度的字符串


共 (5) 个答案

  1. # 1 楼答案

    这不需要json字符串就可以将数据发布到服务器

     class PostLogin extends AsyncTask<Void, Void, String> {
            @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();
        }
    
  2. # 2 楼答案

    试试看

    ...
    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());
    
  3. # 3 楼答案

    HttpURLConnection使用起来很麻烦。有了DavidWebb,一个围绕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有一个糟糕的接口。这个必须包起来

  4. # 4 楼答案

    遵循以下示例:

    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;
    }
    
  5. # 5 楼答案

     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中调用此方法