如何使用OKHTTP发帖请求?

use*_*372 78 java okhttp

我读了一些将jsons发布到服务器的例子.

有人说:

OkHttp是Java提供的HttpUrlConnection接口的实现.它提供了用于编写内容的输入流,并且不知道(或关心)该内容的格式.

现在我想使用名称和密码的参数对URL进行正常发布.

这意味着我需要自己将名称和值对编码为流吗?

Mau*_*ker 101

根据文档,OkHttp版本3替换FormEncodingBuilderFormBodyFormBody.Builder(),因此旧的示例将不再起作用.

表单和Multipart主体现在已建模.我们已经取代不透明 FormEncodingBuilder与更强大FormBodyFormBody.Builder组合.

同样,我们已经升级MultipartBuilderMultipartBody,MultipartBody.PartMultipartBody.Builder.

因此,如果您正在使用OkHttp 3.x,请尝试以下示例:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 在`AsyncTask`或`IntentService`中,或者除主线程之外的任何地方:) (3认同)

Isl*_*lla 85

目前接受的答案已过时.现在,如果您想创建一个帖子请求并向其添加参数,您应该使用MultipartBody.Builder,因为现在不推荐使用Mime Craft.

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("somParam", "someValue")
        .build();

Request request = new Request.Builder()
        .url(BASE_URL + route)
        .post(requestBody)
        .build();
Run Code Online (Sandbox Code Playgroud)

  • 我相信最初的问题与Mime Craft毫无关系.这两个旧的接受答案,因为投票最多的答案已经回答了如何使用OKHttp版本2.x和3.x发出POST请求. (3认同)
  • 对于这个答案工作,您应该添加内容类型标题,如:```.addHeader("Content-Type","application/x-www-form-urlencoded")``` (2认同)

Gen*_*lov 38

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());
  }
Run Code Online (Sandbox Code Playgroud)


Jes*_*son 19

你需要用转义字符串编码自己是URLEncoder的,并与加入他们"=""&".或者您可以使用MimecraftFormEncoder,它为您提供了一个方便的构建器.

FormEncoding fe = new FormEncoding.Builder()
    .add("name", "Lorem Ipsum")
    .add("occupation", "Filler Text")
    .build();
Run Code Online (Sandbox Code Playgroud)


Com*_*ode 12

你可以这样做:

    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 );

        }
    });
Run Code Online (Sandbox Code Playgroud)


Muj*_*han 5

POST标头中带有令牌的OkHttp请求

       RequestBody 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();
                    }
                });
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)