我正在尝试使用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请求的日志,实际上我在日志中看不到任何"文件"文本.
这有什么问题?
我一直在尝试实现拦截器(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()); 返回不同的内容?
我正在尝试升级到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?
我正在使用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) 在阅读了这个问题如何处理异常和这个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
我的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中运行良好

这是来自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) 我想从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) 我正在使用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) 如何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)