标签: retrofit2

Retrofit - Multipart请求:必需的MultipartFile参数'file'不存在

我正在尝试使用Retrofit2在服务器上发送文件.我根据文档做了一切,但总是得到400服务器错误.

我试图这样做:

RequestBody body =
                RequestBody.create(MediaType.parse("image/png"), photo);
    //..........

    @Multipart
    @POST(ADD_PHOTO)
    Observable<HPSPhotoResponse>
    addPhoto(@Part("file") RequestBody file);
Run Code Online (Sandbox Code Playgroud)

......并且像这样:

MultipartBody.Part part = MultipartBody.Part.createFormData("file", "file", body);
     //...........

    @Multipart
    @POST(ADD_PHOTO)
    Observable<HPSPhotoResponse>
    addPhoto(@Part("file") MultipartBody.Part files);
Run Code Online (Sandbox Code Playgroud)

无所谓 结果始终相同"多部分请求:不存在所需的MultipartFile参数'文件'" - 服务器响应.

我认为服务器上的Spring工作不好,但是我在Swift(iOS)上做了相同的代码而且它有效!这里服务器看到这个'文件'部分.

Alamofire.upload(method, endpoint, headers: headers,
            multipartFormData: { multipartFormData in
                multipartFormData.appendBodyPart(fileURL: self.filePath!, name: "file")
            }
Run Code Online (Sandbox Code Playgroud)

现在我希望它可以在Android上使用Retrofit.但我甚至查看了Retrofit请求的日志,实际上我在日志中看不到任何"文件"文本.

这有什么问题?

android multipartform-data multipart retrofit retrofit2

23
推荐指数
1
解决办法
3万
查看次数

Android Retrofit 2,addInterceptor和addNetworkInterceptor之间的差异用于编辑响应

我一直在尝试实现拦截器(OkHttp 3.2和Retrofit 2),以便在作为响应返回之前编辑JSON响应.我们请求数据的服务器返回成功或错误的不同数据依赖性,这使得难以映射对象.

我试图通过将拦截器添加到Retrofit作为NetworkInterceptor来实现,但返回的字符串没有格式.

@Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        Response response = chain.proceed(request);
        try {

            final String responseString = new String(response.body().bytes() ); 

            LOGD("OkHttp-NET-Interceptor", "Response: " + responseString);

            String  newResponseString = editResponse( responseString );

            LOGD("OkHttp-NET-Interceptor", "Response edited: " + newResponseString);
            return  response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), newResponseString))
                    .build();

        }catch (Exception ex){
            return response;
        }
    }
Run Code Online (Sandbox Code Playgroud)

responseString有一个没有任何可理解格式的字符串.

在更改为普通拦截器之后,字符串具有能够转换为JSONObject的格式.

可以告诉我某些回复之间的差异吗?

为什么这行新的String(response.body().bytes()); 返回不同的内容?

android interceptor retrofit2 okhttp3

23
推荐指数
1
解决办法
9801
查看次数

如何使用rxjava在retrofit 2.0中获取请求URL?

我正在尝试升级到Retrofit 2.0并在我的android项目中添加RxJava.我正在进行api调用,并想要将sqlite中的响应数据作为缓存来检索url和它

Observable<MyResponseObject> apiCall(@Body body);
Run Code Online (Sandbox Code Playgroud)

并在RxJava调用中:

myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(MyResponseObject myResponseObject) {

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

在Retrofit 1.9中,我们可以获得成功回调中的url:

        @Override
        public void success(MyResponseObject object, Response response) {
            String url=response.getUrl();
            //save object data and url to sqlite
        }
Run Code Online (Sandbox Code Playgroud)

如何使用RxJava进行Retrofit 2.0?

android rx-java retrofit2

23
推荐指数
1
解决办法
1万
查看次数

改造将多个图像上传到单个密钥

我正在使用Retrofit将图像上传到我的服务器.在这里,我需要为单个密钥上传多个图像.我已经尝试使用Postman Web客户端,它运行良好.这是一个截图.在此输入图像描述

以下是请求的键值对.
SurveyImage:[file1,file2,file3];
PropertyImage:文件
DRA:jsonBody

我试图用Retrofit做同样的事情.但图像没有上传到服务器.这是我的代码.
WebServicesAPI.java

public interface WebServicesAPI {
    @Multipart
    @POST(WebServices.UPLOAD_SURVEY)
    Call<UploadSurveyResponseModel> uploadSurvey(@Part MultipartBody.Part surveyImage, @Part MultipartBody.Part propertyImage, @Part("DRA") RequestBody dra);
}
Run Code Online (Sandbox Code Playgroud)

这是上传文件的方法.

 private void requestUploadSurvey() {
        File propertyImageFile = new File(surveyModel.getPropertyImagePath());
        RequestBody propertyImage = RequestBody.create(MediaType.parse("image/*"), propertyImageFile);
        MultipartBody.Part propertyImagePart = MultipartBody.Part.createFormData("PropertyImage", propertyImageFile.getName(), propertyImage);
        JSONObject requestBody = getRequestBody();
        RequestBody draBody = null;
        try {
            draBody = RequestBody.create(MediaType.parse("text/plain"), requestBody.toString(1));
            Log.d(TAG, "requestUploadSurvey: RequestBody : " + requestBody.toString(1));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM); …
Run Code Online (Sandbox Code Playgroud)

android multipartform-data okhttp retrofit2

23
推荐指数
3
解决办法
3万
查看次数

协程和改造,处理错误的最佳方式

在阅读了这个问题如何处理异常和这个2019 年的中型Android 网络 - 使用 Kotlin 的协程改造后,我创建了我的解决方案,其中包括BaseService能够进行改造调用并将结果和异常转发到“链”中:

应用程序接口

@GET("...")
suspend fun fetchMyObject(): Response<List<MyObject>>
Run Code Online (Sandbox Code Playgroud)

基本服务

protected suspend fun <T : Any> apiCall(call: suspend () -> Response<T>): Result<T> {
    val response: Response<T>
    try {
        response = call.invoke()
    } catch (t: Throwable) {
        return Result.Error(mapNetworkThrowable(t))
    }
    if (!response.isSuccessful) {
        return Result.Error...
    }
    return Result.Success(response.body()!!)
}
Run Code Online (Sandbox Code Playgroud)

儿童服务

suspend fun fetchMyObject(): Result<List<MyObject>> {
    return apiCall(call = { api.fetchMyObject() })
}
Run Code Online (Sandbox Code Playgroud)

回购

    suspend fun myObjectList(): List<MyObject> {
        return …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-android-extensions retrofit2 kotlin-coroutines

23
推荐指数
1
解决办法
1万
查看次数

改造-2内容类型问题

我的Api正在接受Content-Type application/json作为标题.我按照Retrofit Docs中的说法完美地设置了Header.

@Headers("Content-Type: application/json")
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Run Code Online (Sandbox Code Playgroud)

但在请求日志中它返回Content-Type txt/html.那么我应该如何解决这个问题呢?这个api在POSTMAN中运行良好 在此输入图像描述

在此输入图像描述

android retrofit retrofit2

22
推荐指数
4
解决办法
6万
查看次数

使用Retrofit&Gson解析JSON数组响应

这是来自Web服务的JSONArray响应:

[
  {
    "sponsors": [
      {
        "leg_id": "NYL000067",
        "type": "primary",
        "name": "AUBRY"
      },
      {
        "leg_id": "NYL000171",
        "type": "cosponsor",
        "name": "PERRY"
      },
      {
        "leg_id": "NYL000066",
        "type": "cosponsor",
        "name": "ARROYO"
      },
      {
        "leg_id": "NYL000223",
        "type": "cosponsor",
        "name": "BARRETT"
      },
      {
        "leg_id": "NYL000312",
        "type": "cosponsor",
        "name": "STECK"
      },
      {
        "leg_id": "NYL000180",
        "type": "cosponsor",
        "name": "RIVERA"
      },
      {
        "leg_id": "NYL000114",
        "type": "cosponsor",
        "name": "GOTTFRIED"
      },
      {
        "leg_id": "NYL000091",
        "type": "cosponsor",
        "name": "COOK"
      },
      {
        "leg_id": "NYL000126",
        "type": "cosponsor",
        "name": "JAFFEE"
      },
      {
        "leg_id": "NYL000327", …
Run Code Online (Sandbox Code Playgroud)

android json gson retrofit2

22
推荐指数
3
解决办法
3万
查看次数

Kotlin中的Retrofit2 + SimpleXML:MethodException:Annotation必须标记set或get方法

我想从API中获取XML数据,并使用Kotlin中的Retrofit2 + SimpleXML将其映射到Kotlin模型对象.

但是,我收到了来自SimpleXML的以下错误消息.

org.simpleframework.xml.core.MethodException:注释@ org.simpleframework.xml.Element(data = false,name =,required = true,type = void)必须标记set或get方法

这是获取的XML数据

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <result code="0">Success</result>
    <token>XXXXXXXXXXXXXXXXXXXX</token>
    <uid>4294967295</uid>
</response>
Run Code Online (Sandbox Code Playgroud)

Kotlin模型对象如下

@Root(name = "response")
public class User() {
    @Element public var result: String? = null
    @Element public var token: String? = null
    @Element public var uid: String? = null
}
Run Code Online (Sandbox Code Playgroud)

和APIClient如下.

interface  MyService {
    @GET("/testLogin.xml")
    fun getUser(): Call<User>
}

val retrofit = Retrofit.Builder()
        .baseUrl(baseURL)
        .addConverterFactory(SimpleXmlConverterFactory.create())
        .build()
val call = retrofit.create(MyService::class.java).getUser()
call.enqueue(object: Callback<User> {
        override fun onResponse(p0: …
Run Code Online (Sandbox Code Playgroud)

android kotlin simple-framework retrofit2

21
推荐指数
1
解决办法
5716
查看次数

RxJava:如何使用zip操作符处理错误?

我正在使用RxJava和RxAndroid与Retrofit2.

Observable<ResponseOne> responseOneObservable = getRetrofitClient().getDataOne()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());

Observable<ResponseTwo> responseTwoObservable = getRetrofitClient().getDataTwo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
Run Code Online (Sandbox Code Playgroud)

在上面两个Observer上使用如下的zip操作符.

 Observable<ArrayList<TestData>> testDataObservable = Observable.zip(responseOneObservable, responseTwoObservable, new Func2<ResponseOne, ResponseTwo, ArrayList<TestData>>() {
            @Override
                public ArrayList<TestData> call(ResponseOne responseOne, ResponseTwo responseTwo) {
                  ArrayList<TestData> testDataList = new ArrayList();
                      // Add test data from response responseOne & responseTwo
                  return testDataList;
            } 
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<ArrayList<TestData>>() {

        @Override
        public void onNext(ArrayList<TestData> testDataList) {

        }

        @Override
        public void onCompleted() {
            Log.d(TAG, "onCompleted" );
        }

        @Override
        public void onError(Throwable t) {
            Log.d(TAG, "onError Throwable: …
Run Code Online (Sandbox Code Playgroud)

error-handling android rx-java rx-android retrofit2

21
推荐指数
1
解决办法
1万
查看次数

改造:如果响应代码为401,则重定向到LoginActivity

如何LoginActivity从拦截器(非活动类)开始?我已经尝试过Interceptor下面的代码()但不适合我.

拦截器

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {

                Request newRequest = chain.request().newBuilder()
                        .addHeader("Authorization", "Bearer " + auth_token_string)
                        .build();

                Response response =  chain.proceed(newRequest);
                Log.d("MyApp", "Code : "+response.code());
                if (response.code() == 401){
                    Intent intent = new Intent(SplashActivity.getContextOfApplication(), LoginActivity.class);
                    startActivity(intent);
                    finish();  //Not working
                    return response;
                }

                return chain.proceed(newRequest);
            }
        }).build();
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的当前解决方案,有没有比这更好的解决方案?该解决方案必须在每次api呼叫时保持重复.

主要活动

call.enqueue(new Callback<Token>() {
            @Override
            public void onResponse(Call<Token> call, Response<Token> response) {
                if(response.isSuccessful())
                {
                    //success
                }
                else
                {
                    Intent …
Run Code Online (Sandbox Code Playgroud)

java android retrofit okhttp retrofit2

21
推荐指数
3
解决办法
3150
查看次数