【问题标题】:Java android multipart/form-data send requestJava android multipart/form-data 发送请求
【发布时间】:2017-12-14 18:42:22
【问题描述】:

我想发送 multipart/form-data 。我想在一个请求中发送一张照片和一个json。我这样做了:

  JSONObject jsonObject = new JSONObject();
    SharedPreferences sp ;
    sp = getSharedPreferences("pfref", Activity.MODE_PRIVATE);
    String pass = sp.getString("pass", "");
    String firm = sp.getString("firm", "");
    String login = sp.getString("login", "");

    try {
        jsonObject.put("company", firm);
        jsonObject.put("user", login);
        jsonObject.put("secure_password", HashUtil.md5(pass));
        jsonObject.put("secure_device_id", HashUtil.md5(DeviceUtil.getDeviceId(PhotoActivity.this)));
    } catch (JSONException e) {
        e.printStackTrace();
    }

    ImageLoader imageLoader = ImageLoader.getInstance();

    FileEntity fileEntity = null;
    try {
        fileEntity = new FileEntity(file, "image/jpeg");
    } catch (Exception e) {
        e.printStackTrace();
    }

    RequestParams params = new RequestParams();
    BasicHeader[] headers = new BasicHeader[]{new BasicHeader("Authorization", "SCToken " + token)};
    params.put("photos", fileEntity);
    params.put("metadata",jsonObject);

    client.post(PhotoActivity.this, RestClient.getAbsoluteUrl("photos/note"), headers, params, "multipart/form-data", new AsyncHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            Log.d("sokces", "uploadFile response: " + statusCode);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.d("sokces fail", "uploadFile ERROR! " + statusCode);
        }
    });

但它不起作用。当我将内容类型更改为 application/json 我有一个 415 status 但是当我有一个 multipart/form-data 我有一个 400 status 。这是一个失败状态。

【问题讨论】:

  • 您在免费托管服务器上吗?在那种情况下,this question 说这可能是个问题
  • 对于一个快速的建议,您应该先尝试邮递员的请求,然后将其转换为 java 或任何东西。
  • @AlNoman 这是我对肥皂的要求:paste.ofcode.org/f9eXv3e6RtQhv3DSazVu4A
  • @tompok 是您在向邮递员请求后得到的响应还是请求邮递员?
  • @AlNoman 这是来自 SoapUI 的请求

标签: android multipartform-data


【解决方案1】:

你的 REST 服务应该像这样

@POST
    @Path("/pic")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail,
            @FormParam("json") String json)
{
         ...............
            JSONObject jsonObject=new JSONObject(json);

}

使用改造 API

 @Multipart
    @POST("TestService/upload/pic")
    Call<ResponseBody> Upload_Docs(@Part MultipartBody.Part body,@Field("json") String json);

在你的活动中

Retrofit retrofit = Retrofit_Api.getClient();
Service_Interface service_interface = retrofit.create(Service_Interface.class);

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                RequestBody body = RequestBody.create(okhttp3.MediaType.parse("multipart/form-data"), file1);
                MultipartBody.Part body11 = MultipartBody.Part.createFormData("file", file1.getName(), body);

String json="{ "name":"test"}";
Call<ResponseBody> call = service_interface.Upload_Docs(body11,json);

                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        try {
                            Utils.Toast_L(getContext(), response.body().string());
                            // if(fileToUpload.delete());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {
                        Utils.Toast_L(getContext(), t.toString());
                    }
                });

 }
        });

改造 APi 类的样子

public class Retrofit_Api {

    public static final String BASE_URL = "http://192.168.2.102:2323/"; // your base URL
    public static Retrofit retrofit = null;


    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit =new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

Retrofit 将您的 HTTP API 转换为 Java 接口。

Service_Interface 类的样子

public interface Service_Interface {

            @Multipart
            @POST("TestService/upload/pic")
            Call<ResponseBody> Upload_Docs(@Part MultipartBody.Part body,@Field("json") String json);


    }

【讨论】:

  • 使用 Retrofit APi 我应该放在哪里?
  • 什么是 Service_Interface ?
  • 阅读改造文档你会得到所有的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多