Articles of 改造

改造 – 多部分请求:必需的MultipartFile参数’file’不存在

我正在尝试使用Retrofit2在服务器上发送文件。 我根据文档做了一切,但总是得到400服务器错误。 我试着这样做: RequestBody body = RequestBody.create(MediaType.parse(“image/png”), photo); //………. @Multipart @POST(ADD_PHOTO) Observable addPhoto(@Part(“file”) RequestBody file); ……并且像这样: MultipartBody.Part part = MultipartBody.Part.createFormData(“file”, “file”, body); //……….. @Multipart @POST(ADD_PHOTO) Observable addPhoto(@Part(“file”) MultipartBody.Part files); 无所谓 结果始终相同“多部分请求:不存在所需的MultipartFile参数’文件’” – 服务器响应。 我认为服务器上的Spring工作不好,但我在Swift(iOS)上做了相同的代码,它的工作原理! 这里服务器看到这个’文件’部分。 Alamofire.upload(method, endpoint, headers: headers, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(fileURL: self.filePath!, name: “file”) } 现在我希望它可以在Android上使用Retrofit。 但我甚至查看了Retrofit请求的日志,实际上我在日志中看不到任何“文件”文本。 这有什么问题?

编译com.squareup.retrofit时出错:converter-simplexml:2.0.0-beta2

所以我正在转换到Retrofit 2.0。 但是,当我尝试将Simple XML转换器添加到build.gradle时,它将不再编译。 这是我的依赖项 dependencies { compile fileTree(dir: ‘libs’, include: [‘*.jar’]) testCompile ‘junit:junit:4.12’ compile ‘com.android.support:appcompat-v7:23.1.1’ compile ‘com.android.support:design:23.1.1’ compile ‘com.squareup.retrofit:retrofit:2.0.0-beta2’ compile ‘com.squareup.okhttp:logging-interceptor:2.6.0’ compile ‘com.squareup.retrofit:converter-simplexml:2.0.0-beta2’ //THIS LINE compile ‘com.google.code.gson:gson:2.3’ compile ‘org.parceler:parceler:0.2.13’ compile ‘com.jakewharton:butterknife:7.0.1’ } 当我去编译我的代码时,我收到以下错误: trouble processing “javax/xml/XMLConstants.class”: Ill-advised or mistaken usage of a core class (java.* or javax.*) when not building a core library. This […]

使用改造在服务器上上传文件

在我的项目中,我必须将从Android设备拍摄的图像发送到服务器站点,它应该存储在磁盘上。 不幸的是,当我在设备站点上调用该方法时,我遇到了这个错误: DEBUG/Retrofit(4429): java.lang.RuntimeException: Unable to write multipart request. at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:86) at retrofit.mime.MultipartTypedOutput.addPart(MultipartTypedOutput.java:49) at retrofit.RequestBuilder.setArguments(RequestBuilder.java:211) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:264) at retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197) at retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243) at retrofit.CallbackRunnable.run(CallbackRunnable.java:38) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at retrofit.Platform$Android$2$1.run(Platform.java:134) at java.lang.Thread.run(Thread.java:856) Caused by: java.io.FileNotFoundException: /external/images/media/1270: open failed: ENOENT (No such file or directory) at libcore.io.IoBridge.open(IoBridge.java:416) at java.io.FileInputStream.(FileInputStream.java:78) at retrofit.mime.TypedFile.writeTo(TypedFile.java:74) at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:83) … 10 more Caused […]

使用改造无效工作从Android登录通过Rest web服务

我正在使用Retrofit 2制作一个Android应用程序。 我的REST Api都是用Liferay编写的。 现在在Liferay,我所看到的是,访问我们需要首先进行身份validation的Web服务。 所以我已经这样认证了 http://test:q1w2e3r4@192.168.0.110:8080/liferay-portlet/api/secure/jsonws/ Liferay有自己的用户身份validation方法,我们已经覆盖了。我检查了Postman的Web服务调用工作正常。 URL:http://test:q1w2e3r4@192.168.0.110:8080/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name forms编码的值 companyId:10154 screenName:xyz password:xyz active:true 如果我把它放在邮递员中,它会正确地获取json响应。 现在,当我从我的Android代码中调用相同的内容时,我得到一个响应“未经授权”。 我的改造服务 public interface LoginApi { @FormUrlEncoded @POST(“/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name”) Call login(@Field(“companyId”)long companyId,@Field(“screenName”)String screenName,@Field(“password”)String password,@Field(“active”)boolean active); } 我的RestApiManager类(此类用于调用服务接口并创建改造构建器) public class RestApiManager { private LoginApi loginApi; public LoginApi login() { if (loginApi==null) { GsonBuilder gson=new GsonBuilder(); gson.registerTypeAdapter(String.class, new StringDeserializer()); Retrofit retrofit=new Retrofit.Builder() .baseUrl(“http://test:q1w2e3r4@192.168.0.110:8080”) […]

改造ETAG和缓存

是否有关于如何向Retrofit + OkHttp添加缓存和ETAG / If-None-Match支持的正确解释? 我正在努力为2个项目添加Etag支持,起初我怀疑HTTP标头可能存在问题,另一个项目已正确设置,缓存仍无法按预期工作。 以下是我试图让它发挥作用。 结果显示缓存似乎在应用程序的同一个实例中工作,但是一旦我重新启动 – 一切都会再次加载。 此外,在我的日志中,我没有看到If-None-Match被添加到请求中,因此我假设服务器不知道ETag并且仍然完全重新计算响应。 以下是一些代码示例: public class RetrofitHttpClient extends UrlConnectionClient { private OkUrlFactory generateDefaultOkUrlFactory() { OkHttpClient client = new com.squareup.okhttp.OkHttpClient(); try { Cache responseCache = new Cache(baseContext.getCacheDir(), SIZE_OF_CACHE); client.setCache(responseCache); } catch (Exception e) { Logger.log(this, e, “Unable to set http cache”); } client.setConnectTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS); client.setReadTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS); return new […]

改装getBodyAs()无法解析服务器错误

我正在尝试解析出现问题时发送的服务器消息。 消息以JSON格式发送: { “Message” : “readable reason”, “Id” : 0, // reason code } 错误的模型类: public class RetrofitError { private String message; private int id; } 使用以下代码创建Retrofit: RestAdapter.Builder builder = new RestAdapter.Builder(); builder.setLog(new AndroidLog(LOG_TAG)); builder.setLogLevel(LogLevel.FULL); builder.setEndpoint(Constants.getUrl()); builder.setRequestInterceptor(requestInterceptor); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setDateFormat(“yyyy-MM-dd’T’HH:mm:ssZ”); gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); gsonBuilder.setPrettyPrinting(); Gson gson = gsonBuilder.create(); builder.setConverter(new GsonConverter(gson)); RestAdapter restAdapter = builder.build(); […]

Retrofit连接失败将RetrofitError.response返回为null

使用Retrofit 1.6.0,OkHTTP 2.0.0和OkHTTP-UrlConnection 2.0.0。 我正在使用Retrofit对不存在的URL进行服务POST。 正如预期的那样调用失败回调。 但是,RetrofitError参数没有响应。 我真的想抓住使用返回的HTTP状态代码 error.getResponse().getStatus() 但由于getResponse()返回null,我不能。 为什么getResponse()为null,如何获取状态? 谢谢。 此外,我收到的错误是UnknownHostException,如预期的那样。 重复:我期待这个错误。 我想知道如何获取HTTP状态代码或者为什么error.getResponse()返回null。 编辑:这是一些代码: RestAdapterBuilderClass.java RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(“http://badURL.DoesntMatter/”); .setRequestInterceptor(sRequestInterceptor) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); sService = restAdapter.create(ServiceInterface.class); ServiceInterface.java @POST(“/Login”) void login(@Body JsonObject body, Callback callback); CallbackClass.java @Override public void failure(RetrofitError error) { if (error.getResponse() == null) { // error.getResponse() is null when I […]

为什么Retrofit会宣传为“Type Safe”库?

我刚刚浏览了他们的主页 ,它说, 适用于Android和Java的types安全的HTTP客户端 为什么Retrofit将自己宣传为Type Safe,而其他图书馆(许多其他受欢迎的图书馆)则没有? 在你回答之前…… 这里有同样问题的答案。 它说, types安全性是编程语言阻止或防止types错误的程度。 types错误是由程序的常量,variables和方法(函数)的不同数据types之间的差异引起的错误或不期望的程序行为,例如,将整数(int)视为浮点数(浮点数)。 这在静态types语言(如Java和C)中很常见 因此,Retrofit可以防止此类错误 如果这确实是答案,那么许多库会阻止这些types的错误,但它们都没有宣传为types安全。 那是营销吗? 我认为上述答案不充分,因为types安全的定义尚未得到认真对待。 无论如何,还有另一篇关于Type Safety定义的文章 。 他们给出了例子: types安全意味着编译器将在编译时validationtypes,并在尝试将错误types分配给variables时抛出错误。 一些简单的例子: // Fails, Trying to put an integer in a string String one = 1; // Also fails. int foo = “bar”; 这也适用于方法参数,因为您将显式types传递给它们: int AddTwoNumbers(int a, int b) { return a + b; } 如果我尝试使用以下方法调用: […]

如何在Android上的Retrofit中处理可能是ARRAY或OBJECT的参数?

我遇到的问题是我正在解析的API会返回一个大小为1的ARRAY的OBJECT。 例如,有时API会响应: { “monument”: [ { “key”: 4152, “name”: “MTS – Corporate Head Office”, “categories”: {}, “address”: {} }, { “key”: 4151, “name”: “Canadian Transportation Agency”, “categories”: {}, “address”: {} }, { “key”: 4153, “name”: “Bank of Montreal Building”, “categories”: {}, “address”: {} } ], } 但是,如果monumentarrays只有1个项目,它就变成了一个OBJECT(注意缺少[]括号),如下所示: { “monument”: { “key”: 4152, “name”: “MTS – […]

使用改造2获得简单的json对象

我的api打印一个简单的json对象,如下所示: {“status”:1} 怎么说改装(v2)将它传递给gson并返回一个JSONObject包含这个键值对作为响应? 我试过以下: Call result(); 但是当在onResponse (Response response)方法中打印response.body()时,它返回{} ,这意味着它是空的。