Eu li alguns exemplos que estão postando jsons no servidor.
alguém diz:
OkHttp é uma implementação da interface HttpUrlConnection fornecida por Java. Ele fornece um fluxo de entrada para escrever conteúdo e não sabe (ou se preocupa) com o formato desse conteúdo.
Agora quero fazer uma postagem normal na URL com parâmetros de nome e senha.
Isso significa que preciso codificar o par de nome e valor no stream sozinho?
Respostas:
A resposta aceita atualmente está desatualizada. Agora, se você quiser criar uma pós-solicitação e adicionar parâmetros a ela, você deve usar MultipartBody.Builder, pois o Mime Craft agora está obsoleto .
RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("somParam", "someValue") .build(); Request request = new Request.Builder() .url(BASE_URL + route) .post(requestBody) .build();
fonte
int
para umString
@AqibBangash.addHeader("Content-Type", " application/x-www-form-urlencoded")
De acordo com os documentos , o OkHttp versão 3 foi substituído
FormEncodingBuilder
porFormBody
eFormBody.Builder()
, portanto, os exemplos antigos não funcionarão mais.Portanto, se você estiver usando o OkHttp 3.x, tente o seguinte exemplo:
OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("message", "Your message") .build(); Request request = new Request.Builder() .url("http://www.foo.bar/index.php") .post(formBody) .build(); try { Response response = client.newCall(request).execute(); // Do something with the response. } catch (IOException e) { e.printStackTrace(); }
fonte
AsyncTask
, ouIntentService
, ou em qualquer lugar exceto no tópico principal :).add("message", "Your message")
naadd
chamada do método, qual é o argumento de duas strings? Eu quero passar apenas um conteúdo de string do corpo . Quão?private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception { RequestBody formBody = new FormEncodingBuilder() .add("search", "Jurassic Park") .build(); Request request = new Request.Builder() .url("https://en.wikipedia.org/w/index.php") .post(formBody) .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string()); }
fonte
Você mesmo precisa codificá-lo escapando strings com URLEncoder e juntando-os com
"="
e"&"
. Ou você pode usar FormEncoder da Mimecraft, que é um construtor prático.FormEncoding fe = new FormEncoding.Builder() .add("name", "Lorem Ipsum") .add("occupation", "Filler Text") .build();
fonte
HttpUrl
classe (da biblioteca OkHttp).Você pode fazer assim:
MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON, "{"jsonExample":"value"}"); OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .post(body) .addHeader("Authorization", "header value") //Notice this request has header if you don't need to send a header just erase this part .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { Log.e("HttpService", "onFailure() Request was: " + request); e.printStackTrace(); } @Override public void onResponse(Response r) throws IOException { response = r.body().string(); Log.e("response ", "onResponse(): " + response ); } });
fonte
Para adicionar okhttp como uma dependência, faça o seguinte
agora você tem okhttp como uma dependência
Agora projete uma interface como abaixo para que possamos ter o retorno de chamada para nossa atividade assim que a resposta da rede for recebida.
public interface NetworkCallback { public void getResponse(String res); }
Eu crio uma classe chamada NetworkTask para que possa usar esta classe para lidar com todas as solicitações de rede
public class NetworkTask extends AsyncTask<String , String, String>{ public NetworkCallback instance; public String url ; public String json; public int task ; OkHttpClient client = new OkHttpClient(); public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public NetworkTask(){ } public NetworkTask(NetworkCallback ins, String url, String json, int task){ this.instance = ins; this.url = url; this.json = json; this.task = task; } public String doGetRequest() throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } public String doPostRequest() throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } @Override protected String doInBackground(String[] params) { try { String response = ""; switch(task){ case 1 : response = doGetRequest(); break; case 2: response = doPostRequest(); break; } return response; }catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); instance.getResponse(s); } }
agora deixe-me mostrar como obter o retorno de chamada para uma atividade
public class MainActivity extends AppCompatActivity implements NetworkCallback{ String postUrl = "http://your-post-url-goes-here"; String getUrl = "http://your-get-url-goes-here"; Button doGetRq; Button doPostRq; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); doGetRq = findViewById(R.id.button2); doPostRq = findViewById(R.id.button1); doPostRq.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.this.sendPostRq(); } }); doGetRq.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MainActivity.this.sendGetRq(); } }); } public void sendPostRq(){ JSONObject jo = new JSONObject(); try { jo.put("email", "yourmail"); jo.put("password","password"); } catch (JSONException e) { e.printStackTrace(); } // 2 because post rq is for the case 2 NetworkTask t = new NetworkTask(this, postUrl, jo.toString(), 2); t.execute(postUrl); } public void sendGetRq(){ // 1 because get rq is for the case 1 NetworkTask t = new NetworkTask(this, getUrl, jo.toString(), 1); t.execute(getUrl); } @Override public void getResponse(String res) { // here is the response from NetworkTask class System.out.println(res) } }
fonte
POST
Solicitação OkHttp com token no cabeçalhoRequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("search", "a") .addFormDataPart("model", "1") .addFormDataPart("in", "1") .addFormDataPart("id", "1") .build(); OkHttpClient client = new OkHttpClient(); okhttp3.Request request = new okhttp3.Request.Builder() .url("https://somedomain.com/api") .post(requestBody) .addHeader("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIkMnkkMTAkZzZrLkwySlFCZlBmN1RTb3g3bmNpTzltcVwvemRVN2JtVC42SXN0SFZtbzZHNlFNSkZRWWRlIiwic3ViIjo0NSwiaWF0IjoxNTUwODk4NDc0LCJleHAiOjE1NTM0OTA0NzR9.tefIaPzefLftE7q0yKI8O87XXATwowEUk_XkAOOQzfw") .addHeader("cache-control", "no-cache") .addHeader("Postman-Token", "7e231ef9-5236-40d1-a28f-e5986f936877") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, okhttp3.Response response) throws IOException { if (response.isSuccessful()) { final String myResponse = response.body().string(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Log.d("response", myResponse); progress.hide(); } }); } } });
fonte
Esta é uma das soluções possíveis para implementar uma solicitação de postagem OKHTTP sem um corpo de solicitação.
RequestBody reqbody = RequestBody.create(null, new byte[0]); Request.Builder formBody = new Request.Builder().url(url).method("POST",reqbody).header("Content-Length", "0"); clientOk.newCall(formBody.build()).enqueue(OkHttpCallBack());
fonte
Você deve verificar os tutoriais em lynda.com . Aqui está um exemplo de como codificar os parâmetros, fazer uma solicitação HTTP e, em seguida, analisar a resposta para o objeto json.
public JSONObject getJSONFromUrl(String str_url, List<NameValuePair> params) { String reply_str = null; BufferedReader reader = null; try { URL url = new URL(str_url); OkHttpClient client = new OkHttpClient(); HttpURLConnection con = client.open(url); con.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); writer.write(getEncodedParams(params)); writer.flush(); StringBuilder sb = new StringBuilder(); reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } reply_str = sb.toString(); } catch (Exception e) { e.printStackTrace(); return null; } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); return null; } } } // try parse the string to a JSON object. There are better ways to parse data. try { jObj = new JSONObject(reply_str); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jObj; } //in this case it's NameValuePair, but you can use any container public String getEncodedParams(List<NameValuePair> params) { StringBuilder sb = new StringBuilder(); for (NameValuePair nvp : params) { String key = nvp.getName(); String param_value = nvp.getValue(); String value = null; try { value = URLEncoder.encode(param_value, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (sb.length() > 0) { sb.append("&"); } sb.append(key + "=" + value); } return sb.toString(); }
fonte
protected Void doInBackground(String... movieIds) { for (; count <= 1; count++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } Resources res = getResources(); String web_link = res.getString(R.string.website); OkHttpClient client = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("name", name) .add("bsname", bsname) .add("email", email) .add("phone", phone) .add("whatsapp", wapp) .add("location", location) .add("country", country) .add("state", state) .add("city", city) .add("zip", zip) .add("fb", fb) .add("tw", tw) .add("in", in) .add("age", age) .add("gender", gender) .add("image", encodeimg) .add("uid", user_id) .build(); Request request = new Request.Builder() .url(web_link+"edit_profile.php") .post(formBody) .build(); try { Response response = client.newCall(request).execute(); JSONArray array = new JSONArray(response.body().string()); JSONObject object = array.getJSONObject(0); hashMap.put("msg",object.getString("msgtype")); hashMap.put("msg",object.getString("msg")); // Do something with the response. } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; }
fonte
Aqui está o meu método para fazer a primeira passagem da solicitação de postagem no mapa de método e dados como
HashMap<String, String> param = new HashMap<String, String>(); param.put("Name", name); param.put("Email", email); param.put("Password", password); param.put("Img_Name", ""); final JSONObject result = doPostRequest(map,Url); 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; }
fonte
fonte
public static JSONObject doPostRequestWithSingleFile(String url,HashMap<String, String> data, File file,String fileParam) { try { final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); RequestBody requestBody; MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); for (String key : data.keySet()) { String value = data.get(key); Utility.printLog("Key Values", key + "-----------------" + value); mBuilder.addFormDataPart(key, value); } if(file!=null) { Log.e("File Name", file.getName() + "==========="); if (file.exists()) { mBuilder.addFormDataPart(fileParam, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } requestBody = mBuilder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); String result=response.body().string(); Utility.printLog("Response",result+""); return new JSONObject(result); } catch (UnknownHostException | UnsupportedEncodingException e) { Log.e(TAG, "Error: " + e.getLocalizedMessage()); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } } catch (Exception e) { Log.e(TAG, "Other Error: " + e.getMessage()); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); } catch (JSONException e1) { e1.printStackTrace(); } } return null; } public static JSONObject doGetRequest(HashMap<String, String> param,String url) { JSONObject result = null; String response; Set keys = param.keySet(); int count = 0; for (Iterator i = keys.iterator(); i.hasNext(); ) { count++; String key = (String) i.next(); String value = (String) param.get(key); if (count == param.size()) { Log.e("Key",key+""); Log.e("Value",value+""); url += key + "=" + URLEncoder.encode(value); } else { Log.e("Key",key+""); Log.e("Value",value+""); url += key + "=" + URLEncoder.encode(value) + "&"; } } /* try { url= URLEncoder.encode(url, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }*/ Log.e("URL", url); OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); Response responseClient = null; try { responseClient = client.newCall(request).execute(); response = responseClient.body().string(); result = new JSONObject(response); Log.e("response", response+"=============="); } catch (Exception e) { JSONObject jsonObject=new JSONObject(); try { jsonObject.put("status","false"); jsonObject.put("message",e.getLocalizedMessage()); return jsonObject; } catch (JSONException e1) { e1.printStackTrace(); } e.printStackTrace(); } return result; }
fonte