Java - enviando parâmetros HTTP via método POST facilmente

319

Estou usando este código com sucesso para enviar HTTPsolicitações com alguns parâmetros via GETmétodo

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

Agora, talvez eu precise enviar os parâmetros (por exemplo, param1, param2, param3) via POSTmétodo, porque eles são muito longos. Eu estava pensando em adicionar um parâmetro extra para esse método (ou seja, String httpMethod).

Como posso alterar o código acima o mínimo possível para enviar parâmetros via GETou POST?

Eu estava esperando que a mudança

connection.setRequestMethod("GET");

para

connection.setRequestMethod("POST");

teria feito o truque, mas os parâmetros ainda são enviados pelo método GET.

Tem HttpURLConnectionalgum método que ajudaria? Existe alguma construção Java útil?

qualquer ajuda seria muito bem vinda.

dan
fonte
Os parâmetros de postagem são enviados dentro da seção do cabeçalho http e não no URL. (seu post url seria http://example.com/index.php)
dacwe
2
não há nenhum método setRequestMethod em Java 1,6 definido: docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo
2
Transmiti-lo para Http (s) UrlConnection ....
Peter Kriens
estendendo a pergunta! Alguém tem alguma idéia de como enviar um anexo como parâmetro post ...
therealprashant
1
Por que o primeiro trecho de código começa com a palavra-chave "função"?
Llew Vallis # 29/18

Respostas:

470

Em uma solicitação GET, os parâmetros são enviados como parte da URL.

Em uma solicitação POST, os parâmetros são enviados como um corpo da solicitação, após os cabeçalhos.

Para fazer um POST com HttpURLConnection, você precisa gravar os parâmetros na conexão depois de abrir a conexão.

Este código deve começar:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
URL    url            = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
   wr.write( postData );
}
Alan Geleynse
fonte
40
@ Alan Geleynse: 'url.openconnection ()' não abre a conexão. Caso você não especifique uma instrução connect (), a conexão é aberta quando você escreve para o corpo da solicitação http / ouvida e a envia. Eu tentei isso com certificados. O handshake ssl ocorre somente depois que você chama connect ou quando envia dados ao servidor.
Ashwin 23/03
14
getBytes () usa charaset de ambiente padrão, NÃO UTF-8 charset = utf-8 deve seguir o tipo de conteúdo: application / x-www-form-urlencoded; charset = utf-8 Você faz conversão de bytes duas vezes no exemplo. Deveria fazer: byte [] data = urlParameters.getData ("UTF-8"); connection.getOutputStream (). write (dados); não use para fechar e nivelado e desligue
Peter Kriens
8
@ PeterKriens Obrigado pela sua adição - acredito que você quis dizer byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")):).
gerrytan
7
@AlanGeleynse Não perca wr.flush (); e wr.close (); no fim?
Confile3 /
9
Como é que isso tem tantos votos positivos, se não está funcionando? Você precisa ligar conn.getResponseCode()ou conn.getInputStream()não, pois ele não enviará nenhum dado.
Imaskar 04/04
229

Aqui está um exemplo simples que envia um formulário e despeja a página de resultado em System.out. Altere a URL e os parâmetros do POST conforme apropriado, é claro:

import java.io.*;
import java.net.*;
import java.util.*;

class Test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.net/new-message.php");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("name", "Freddie the Fish");
        params.put("email", "[email protected]");
        params.put("reply_to_thread", 10394);
        params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(postDataBytes);

        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        for (int c; (c = in.read()) >= 0;)
            System.out.print((char)c);
    }
}

Se você deseja que o resultado seja Stringimpresso em vez de impresso diretamente, faça:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();
Boann
fonte
Esta é a melhor resposta, pois inclui a codificação de parâmetros e o uso do Map.
Arejado
4
Infelizmente, esse código pressupõe que a codificação do conteúdo seja UTF-8, o que nem sempre é o caso. Para recuperar o conjunto de caracteres, deve-se obter o cabeçalho Content-Typee analisar o conjunto de caracteres. Quando esse cabeçalho não está disponível, use o padrão http: ISO-8859-1.
engineercoding
@Aprel IFTFY ... usar expressões com efeitos colaterais nas avaliações é realmente feio.
1
Infelizmente, para o HTML, é ainda mais difícil fazê-lo completamente corretamente, pois também pode haver uma BOM Unicode ou um cabeçalho <meta charset="...">ou <meta http-equiv="Content-Type" content="...">dentro do documento que precisa ser analisado.
Boann
1
@ Nepster Não faça isso. response += line;é fenomenalmente lento e come quebras de linha. Adicionei à resposta um exemplo de como obter uma resposta de string.
Boann 28/02
63

Não consegui que o exemplo de Alan realmente fizesse o post, então acabei com isso:

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
writer.close();
reader.close();         
Craigo
fonte
1
Infelizmente, este código não lê a resposta. Ele lê o formulário vazio html.
Kovács Imre
o que eu tive que adicionar ao exemplo de Alan foi abrir o fluxo de resposta. antes de eu ter feito isso, nenhum bytes foi realmente enviado.
beefeather
1
A remoção da chamada writer.close () fez isso por mim.
Maxime T
23

Acho HttpURLConnectionrealmente complicado de usar. E você precisa escrever um monte de clichê, código propenso a erros. Eu precisava de um invólucro leve para meus projetos do Android e criei uma biblioteca que você também pode usar: DavidWebb .

O exemplo acima pode ser escrito assim:

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
        .param("param1", "a")
        .param("param2", "b")
        .param("param3", "c")
        .ensureSuccess()
        .asVoid();

Você pode encontrar uma lista de bibliotecas alternativas no link fornecido.

hgoebl
fonte
1
Não vou votar porque sua postagem foi menos uma resposta e mais um anúncio ... mas, eu brinquei com sua biblioteca e eu gosto. Muito sucinto; muito açúcar sintático; se você usa Java como uma linguagem de script como eu, é uma ótima biblioteca para adicionar de maneira muito rápida e eficiente algumas interações http. Às vezes, o clichê zero é valioso e pode ter sido útil para o OP.
Dean
3
Eu vou votar. Usei com sucesso o DavidWebb em um dos meus aplicativos e farei isso por mais dois que estarei desenvolvendo em breve. Muito fácil de usar.
William T. Mallard
Obrigado, o uso de DefaultHttpClient com https no Android falha com SSLPeerUnverifiedException: nenhum certificado de mesmo nível (mesmo em certificados https assinados corretamente), o URL é complicado (parâmetros de codificação, verificação de resultado). Usando DavidWebb funcionou para mim, obrigado.
Martin Vysny
nenhum suporte ao AsyncTask? Então, bloqueando o segmento interface do usuário por padrão ... isso é ruim
slinden77
É uma biblioteca muito básica. O programador deve chamá-lo de thread de segundo plano, no AsyncTask, no IntentService, no Synchronization Handler e similares. E isso não depende do Android -> também pode ser usado no Java SE e EE.
hgoebl
12

Eu li as respostas acima e criei uma classe de utilitário para simplificar a solicitação HTTP. Espero que ajude você.

Chamada de método

  // send params with Hash Map
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("email","[email protected]");
    params.put("password","12345");

    //server url
    String url = "http://www.example.com";

    // static class "HttpUtility" with static method "newRequest(url,method,callback)"
    HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() {
        @Override
        public void OnSuccess(String response) {
        // on success
           System.out.println("Server OnSuccess response="+response);
        }
        @Override
        public void OnError(int status_code, String message) {
        // on error
              System.out.println("Server OnError status_code="+status_code+" message="+message);
        }
    });

Classe de utilidade

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import static java.net.HttpURLConnection.HTTP_OK;

public class HttpUtility {

 public static final int METHOD_GET = 0; // METHOD GET
 public static final int METHOD_POST = 1; // METHOD POST

 // Callback interface
 public interface Callback {
  // abstract methods
  public void OnSuccess(String response);
  public void OnError(int status_code, String message);
 }
 // static method
 public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) {

  // thread for handling async task
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     String url = web_url;
     // write GET params,append with url
     if (method == METHOD_GET && params != null) {
      for (Map.Entry < String, String > item: params.entrySet()) {
       String key = URLEncoder.encode(item.getKey(), "UTF-8");
       String value = URLEncoder.encode(item.getValue(), "UTF-8");
       if (!url.contains("?")) {
        url += "?" + key + "=" + value;
       } else {
        url += "&" + key + "=" + value;
       }
      }
     }

     HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
     urlConnection.setUseCaches(false);
     urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data
     urlConnection.setRequestProperty("charset", "utf-8");
     if (method == METHOD_GET) {
      urlConnection.setRequestMethod("GET");
     } else if (method == METHOD_POST) {
      urlConnection.setDoOutput(true); // write POST params
      urlConnection.setRequestMethod("POST");
     }

     //write POST data 
     if (method == METHOD_POST && params != null) {
      StringBuilder postData = new StringBuilder();
      for (Map.Entry < String, String > item: params.entrySet()) {
       if (postData.length() != 0) postData.append('&');
       postData.append(URLEncoder.encode(item.getKey(), "UTF-8"));
       postData.append('=');
       postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8"));
      }
      byte[] postDataBytes = postData.toString().getBytes("UTF-8");
      urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
      urlConnection.getOutputStream().write(postDataBytes);

     }
     // server response code
     int responseCode = urlConnection.getResponseCode();
     if (responseCode == HTTP_OK && callback != null) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
      StringBuilder response = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
       response.append(line);
      }
      // callback success
      callback.OnSuccess(response.toString());
      reader.close(); // close BufferReader
     } else if (callback != null) {
      // callback error
      callback.OnError(responseCode, urlConnection.getResponseMessage());
     }

     urlConnection.disconnect(); // disconnect connection
    } catch (IOException e) {
     e.printStackTrace();
     if (callback != null) {
      // callback error
      callback.OnError(500, e.getLocalizedMessage());
     }
    }
   }
  }).start(); // start thread
 }
}
Pankaj Kant Patel
fonte
10

Vejo algumas outras respostas que deram a alternativa, pessoalmente acho que intuitivamente você está fazendo a coisa certa;). Desculpe, no devoxx, onde vários oradores têm discutido sobre esse tipo de coisa.

É por isso que eu pessoalmente uso as bibliotecas HTTPClient / HttpCore do Apache para fazer esse tipo de trabalho; acho que sua API é mais fácil de usar do que o suporte HTTP nativo do Java. YMMV, é claro!

Martijn Verburg
fonte
10
import java.net.*;

public class Demo{

  public static void main(){

       String data = "data=Hello+World!";
       URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       con.setRequestMethod("POST");
       con.setDoOutput(true);
       con.getOutputStream().write(data.getBytes("UTF-8"));
       con.getInputStream();

    }

}
Manish Mistry
fonte
5
WTH import java.net.*;!
Yousha Aleayoub
4

Eu tive o mesmo problema. Eu queria enviar dados via POST. Eu usei o seguinte código:

    URL url = new URL("http://example.com/getval.php");
    Map<String,Object> params = new LinkedHashMap<>();
    params.put("param1", param1);
    params.put("param2", param2);

    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : params.entrySet()) {
        if (postData.length() != 0) postData.append('&');
        postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
        postData.append('=');
        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
    }
    String urlParameters = postData.toString();
    URLConnection conn = url.openConnection();

    conn.setDoOutput(true);

    OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

    writer.write(urlParameters);
    writer.flush();

    String result = "";
    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    while ((line = reader.readLine()) != null) {
        result += line;
    }
    writer.close();
    reader.close()
    System.out.println(result);

Eu usei o Jsoup para análise:

    Document doc = Jsoup.parseBodyFragment(value);
    Iterator<Element> opts = doc.select("option").iterator();
    for (;opts.hasNext();) {
        Element item = opts.next();
        if (item.hasAttr("value")) {
            System.out.println(item.attr("value"));
        }
    }
SergeyUr
fonte
4

Os métodos GET e POST são definidos desta maneira ... Dois tipos para api chamando 1) get () e 2) post (). Método get () para obter valor da matriz api json para obter valor e o método post () use em nosso post de dados em url e obtenha resposta.

 public class HttpClientForExample {

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        HttpClientExample http = new HttpClientExample();

        System.out.println("Testing 1 - Send Http GET request");
        http.sendGet();

        System.out.println("\nTesting 2 - Send Http POST request");
        http.sendPost();

    }

    // HTTP GET request
    private void sendGet() throws Exception {

        String url = "http://www.google.com/search?q=developer";

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        // add request header
        request.addHeader("User-Agent", USER_AGENT);

        HttpResponse response = client.execute(request);

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + 
                       response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                       new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

    // HTTP POST request
    private void sendPost() throws Exception {

        String url = "https://selfsolve.apple.com/wcResults.do";

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);

        // add header
        post.setHeader("User-Agent", USER_AGENT);

        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
        urlParameters.add(new BasicNameValuePair("cn", ""));
        urlParameters.add(new BasicNameValuePair("locale", ""));
        urlParameters.add(new BasicNameValuePair("caller", ""));
        urlParameters.add(new BasicNameValuePair("num", "12345"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " + 
                                    response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                        new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

}
Chirag Patel
fonte
3

Tente este padrão:

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;
}
Pablo Rodriguez Bertorello
fonte
3

Esta resposta cobre o caso específico da chamada POST usando um Java POJO customizado.

Usando dependência maven para o Gson serializar nosso objeto Java para JSON.

Instale o Gson usando a dependência abaixo.

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
  <scope>compile</scope>
</dependency>

Para aqueles que usam gradle pode usar o abaixo

dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}

Outras importações utilizadas:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.*;
import org.apache.http.impl.client.CloseableHttpClient;
import com.google.gson.Gson;

Agora, podemos seguir em frente e usar o HttpPost fornecido pelo Apache

private CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://example.com");

Product product = new Product(); //custom java object to be posted as Request Body
    Gson gson = new Gson();
    String client = gson.toJson(product);

    httppost.setEntity(new StringEntity(client, ContentType.APPLICATION_JSON));
    httppost.setHeader("RANDOM-HEADER", "headervalue");
    //Execute and get the response.
    HttpResponse response = null;
    try {
        response = httpclient.execute(httppost);
    } catch (IOException e) {
        throw new InternalServerErrorException("Post fails");
    }
    Response.Status responseStatus = Response.Status.fromStatusCode(response.getStatusLine().getStatusCode());
    return Response.status(responseStatus).build();

O código acima retornará com o código de resposta recebido da chamada POST

kaushalop
fonte
2

aqui enviei jsonobject como parâmetro // jsonobject = {"name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing " //host=192.168.100.12

  public static String getJson(String serverUrl,String host,String jsonobject){

    StringBuilder sb = new StringBuilder();

    String http = serverUrl;

    HttpURLConnection urlConnection = null;
    try {
        URL url = new URL(http);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.setUseCaches(false);
        urlConnection.setConnectTimeout(50000);
        urlConnection.setReadTimeout(50000);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Host", host);
        urlConnection.connect();
        //You Can also Create JSONObject here 
        OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
        out.write(jsonobject);// here i sent the parameter
        out.close();
        int HttpResult = urlConnection.getResponseCode();
        if (HttpResult == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream(), "utf-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            Log.e("new Test", "" + sb.toString());
            return sb.toString();
        } else {
            Log.e(" ", "" + urlConnection.getResponseMessage());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    return null;
}
Abhisek
fonte
2

Eu recomendo o http-request baseado no apache http api.

Para o seu caso, você pode ver um exemplo:

private static final HttpRequest<String.class> HTTP_REQUEST = 
      HttpRequestBuilder.createPost("http://example.com/index.php", String.class)
           .responseDeserializer(ResponseDeserializer.ignorableDeserializer())
           .build();

public void sendRequest(String request){
     String parameters = request.split("\\?")[1];
     ResponseHandler<String> responseHandler = 
            HTTP_REQUEST.executeWithQuery(parameters);

   System.out.println(responseHandler.getStatusCode());
   System.out.println(responseHandler.get()); //prints response body
}

Se você não está interessado no corpo de resposta

private static final HttpRequest<?> HTTP_REQUEST = 
     HttpRequestBuilder.createPost("http://example.com/index.php").build();

public void sendRequest(String request){
     ResponseHandler<String> responseHandler = 
           HTTP_REQUEST.executeWithQuery(parameters);
}

Para envio geral de solicitação de postagem com solicitação http : Leia a documentação e veja minhas respostas Solicitação HTTP POST com JSON String em JAVA , Enviando solicitação HTTP POST em Java , HTTP POST usando JSON em Java

Beno Arakelyan
fonte
1

Olá pls use esta classe para melhorar seu método de postagem

public static JSONObject doPostRequest(HashMap<String, String> data, String url) {

    try {
        RequestBody requestBody;
        MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

        if (data != null) {


            for (String key : data.keySet()) {
                String value = data.get(key);
                Utility.printLog("Key Values", key + "-----------------" + value);

                mBuilder.addFormDataPart(key, value);

            }
        } else {
            mBuilder.addFormDataPart("temp", "temp");
        }
        requestBody = mBuilder.build();


        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();
        Utility.printLog("URL", url);
        Utility.printLog("Response", responseBody);
        return new JSONObject(responseBody);

    } catch (UnknownHostException | UnsupportedEncodingException e) {

        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Error: " + e.getLocalizedMessage());
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
    }
    return null;
}
CHirag RAmi
fonte
0

Peguei a resposta de Boann e a usei para criar um construtor de cadeias de consulta mais flexível que suporta listas e matrizes, assim como o método http_build_query do php:

public static byte[] httpBuildQueryString(Map<String, Object> postsData) throws UnsupportedEncodingException {
    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : postsData.entrySet()) {
        if (postData.length() != 0) postData.append('&');

        Object value = param.getValue();
        String key = param.getKey();

        if(value instanceof Object[] || value instanceof List<?>)
        {
            int size = value instanceof Object[] ? ((Object[])value).length : ((List<?>)value).size();
            for(int i = 0; i < size; i++)
            {
                Object val = value instanceof Object[] ? ((Object[])value)[i] : ((List<?>)value).get(i);
                if(i>0) postData.append('&');
                postData.append(URLEncoder.encode(key + "[" + i + "]", "UTF-8"));
                postData.append('=');            
                postData.append(URLEncoder.encode(String.valueOf(val), "UTF-8"));
            }
        }
        else
        {
            postData.append(URLEncoder.encode(key, "UTF-8"));
            postData.append('=');            
            postData.append(URLEncoder.encode(String.valueOf(value), "UTF-8"));
        }
    }
    return postData.toString().getBytes("UTF-8");
}
Curtis
fonte
0

Para aqueles com problemas para receber a solicitação em uma página php usando $ _POST porque você espera pares de valores-chave:

Embora todas as respostas tenham sido muito úteis, faltava algum entendimento básico sobre qual string realmente seria publicada, pois no antigo apache HttpClient eu usava

new UrlEncodedFormEntity(nameValuePairs); (Java)

e então poderia usar $ _POST no php para obter os pares de valores-chave.

No meu entendimento agora, construímos essa string manualmente antes de postar. Portanto, a string precisa se parecer com

val data = "key1=val1&key2=val2"

mas, em vez disso, basta adicioná-lo ao URL que é postado (no cabeçalho).

A alternativa seria usar uma string json:

val data = "{\"key1\":\"val1\",\"key2\":\"val2\"}" // {"key1":"val1","key2":"val2"}

e puxe-o em php sem $ _POST:

$json_params = file_get_contents('php://input');
// echo_p("Data: $json_params");
$data = json_decode($json_params, true);

Aqui você encontra um código de exemplo no Kotlin:

class TaskDownloadTest : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var urlConnection: HttpURLConnection? = null

        try {

            val postData = JsonObject()
            postData.addProperty("key1", "val1")
            postData.addProperty("key2", "val2")

            // reformat json to key1=value1&key2=value2
            // keeping json because I may change the php part to interpret json requests, could be a HashMap instead
            val keys = postData.keySet()
            var request = ""
            keys.forEach { key ->
                // Log.i("data", key)
                request += "$key=${postData.get(key)}&"
            }
            request = request.replace("\"", "").removeSuffix("&")
            val requestLength = request.toByteArray().size
            // Warning in Android 9 you need to add a line in the application part of the manifest: android:usesCleartextTraffic="true"
            // /programming/45940861/android-8-cleartext-http-traffic-not-permitted
            val url = URL("http://10.0.2.2/getdata.php")
            urlConnection = url.openConnection() as HttpURLConnection
            // urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") // apparently default
            // Not sure what these are for, I do not use them
            // urlConnection.setRequestProperty("Content-Type", "application/json")
            // urlConnection.setRequestProperty("Key","Value")
            urlConnection.readTimeout = 5000
            urlConnection.connectTimeout = 5000
            urlConnection.requestMethod = "POST"
            urlConnection.doOutput = true
            // urlConnection.doInput = true
            urlConnection.useCaches = false
            urlConnection.setFixedLengthStreamingMode(requestLength)
            // urlConnection.setChunkedStreamingMode(0) // if you do not want to handle request length which is fine for small requests

            val out = urlConnection.outputStream
            val writer = BufferedWriter(
                OutputStreamWriter(
                    out, "UTF-8"
                )
            )
            writer.write(request)
            // writer.write("{\"key1\":\"val1\",\"key2\":\"val2\"}") // {"key1":"val1","key2":"val2"} JsonFormat or just postData.toString() for $json_params=file_get_contents('php://input'); json_decode($json_params, true); in php
            // writer.write("key1=val1&key2=val2") // key=value format for $_POST in php
            writer.flush()
            writer.close()
            out.close()

            val code = urlConnection.responseCode
            if (code != 200) {
                throw IOException("Invalid response from server: $code")
            }

            val rd = BufferedReader(
                InputStreamReader(
                    urlConnection.inputStream
                )
            )
            var line = rd.readLine()
            while (line != null) {
                Log.i("data", line)
                line = rd.readLine()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            urlConnection?.disconnect()
        }

        return null
    }
}
Gunnar Bernstein
fonte
-3

Parece que você também precisa chamar connection.getOutputStream()"pelo menos uma vez" (e também setDoOutput(true)) para que ele seja tratado como um POST.

Portanto, o código mínimo necessário é:

    URL url = new URL(urlString);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //connection.setRequestMethod("POST"); this doesn't seem to do anything at all..so not useful
    connection.setDoOutput(true); // set it to POST...not enough by itself however, also need the getOutputStream call...
    connection.connect();
    connection.getOutputStream().close(); 

Você pode até usar os parâmetros de estilo "GET" no urlString, surpreendentemente. Embora isso possa confundir as coisas.

Você também pode usar o NameValuePair aparentemente.

rogerdpack
fonte
Onde estão os parâmetros POST ...?
Yousha Aleayoub
Por que as pessoas estão votando contra isso? É uma nota para saber como fazer o post de em tudo, embora sem parâmetros ... (ou seja, sem payload0 ...
rogerdpack