如何在Android中使用okhttp库向api(http post)添加参数

时间:2014-06-15 20:05:46

标签: android okhttp

在我的Android应用程序中,我正在使用okHttp库。如何使用okhttp库将参数发送到服务器(api)?目前我使用以下代码访问服务器现在需要使用okhttp库。

这是我的代码:

httpPost = new HttpPost("http://xxx.xxx.xxx.xx/user/login.json");
nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("email".trim(), emailID));
nameValuePairs.add(new BasicNameValuePair("password".trim(), passWord));
httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
String response = new DefaultHttpClient().execute(httpPost, new BasicResponseHandler());

7 个答案:

答案 0 :(得分:47)

对于OkHttp 3.x,已删除FormEncodingBuilder,而是使用FormBody.Builder

        RequestBody formBody = new FormBody.Builder()
                .add("email", "Jurassic@Park.com")
                .add("tel", "90301171XX")
                .build();

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        Response response = client.newCall(request).execute();
        return response.body().string();

答案 1 :(得分:43)

    private final OkHttpClient client = new OkHttpClient();

      public void run() throws Exception {
        RequestBody formBody = new FormEncodingBuilder()
            .add("email", "Jurassic@Park.com")
            .add("tel", "90301171XX")
            .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());
      }

答案 2 :(得分:7)

您只需要在创建RequestBody对象之前格式化POST的主体。

您可以手动执行此操作,但我建议您使用Square的MimeCraft库(OkHttp的制造商)。

在这种情况下,你需要FormEncoding.Builder类;将contentType设置为"application/x-www-form-urlencoded",并为每个键值对使用add(name, value)

答案 3 :(得分:4)

这些答案都没有对我有用,所以我玩得很好,一个人工作得很好。分享以防万一有人遇到同样的问题:

进口:

import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

代码:

OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBuilder()
        .type(MultipartBuilder.FORM) //this is what I say in my POSTman (Chrome plugin)
        .addFormDataPart("name", "test")
        .addFormDataPart("quality", "240p")
        .build();
Request request = new Request.Builder()
        .url(myUrl)
        .post(requestBody)
        .build();
try {
    Response response = client.newCall(request).execute();
    String responseString = response.body().string();
    response.body().close();
    // do whatever you need to do with responseString
}
catch (Exception e) {
    e.printStackTrace();
}

答案 4 :(得分:1)

另一种方式(没有MimeCraft)就是:

    parameters = "param1=text&param2=" + param2  // for example !
    request = new Request.Builder()
            .url(url + path)
            .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, parameters))
            .build();

并声明:

    public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

答案 5 :(得分:0)

如果您想使用OKHTTP 3通过API发送Post数据,请尝试以下简单代码

MediaType MEDIA_TYPE = MediaType.parse("application/json");
        String url = "https://cakeapi.trinitytuts.com/api/add";

        OkHttpClient client = new OkHttpClient();

        JSONObject postdata = new JSONObject();
        try {
            postdata.put("username", "name");
            postdata.put("password", "12345");
        } catch(JSONException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        RequestBody body = RequestBody.create(MEDIA_TYPE, postdata.toString());

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .header("Accept", "application/json")
                .header("Content-Type", "application/json")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                String mMessage = e.getMessage().toString();
                Log.w("failure Response", mMessage);
                //call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String mMessage = response.body().string();
                Log.e(TAG, mMessage);
            }
        });

您可以在此处阅读完整的教程,以使用OKHTTP 3 GET和POST请求将数据发送到服务器:-https://trinitytuts.com/get-and-post-request-using-okhttp-in-android-application/

答案 6 :(得分:0)

(科特林版) 你需要:

...
val formBody = FormBody.Builder()
    .add("your_key", "your_value")
    .build()
val newRequest: Request.Builder = Request.Builder()
    .url("api_url")
    .addHeader("Content-Type", "application/x-www-form-urlencoded")
    .post(formBody)
...

然后,如果您有一个安装了 npm body-parser 的 nodejs express 服务器,请务必执行以下操作:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
...