Android Retrofit api调用参数中的空格

时间:2016-10-13 01:07:21

标签: android retrofit

我正在尝试使用Retrofit 1.x进行API调用:

@POST("/test?api-version=1.0")
void createMyStuff(
        @Header("X-Signature") String authorization,
        @Query(value="nickname") String nickname,
        @Query("language") String language,
        Callback<MyAPIResponse> cb);

问题是:昵称中可以包含空格。    所以,在拨打电话之前,如果昵称是“John Doe”(两个空格),我会替换它中的空格,并在API调用中发送它:“John%20%20Doe”。

400失败请求失败。

errorResponse对象中报告的URL是:     https://.com/foo/test?nickname = john%2520%2520doe&amp; language = en-US

请注意%20被%2520替换

我调查的内容:没有明确的答案。有人在SO中建议使用FunName(value =“apiname”,encodeValue = true)  但是encodeValue没有解析。

我也尝试使用UTF-8进行编码,但它不起作用。我不确定URL编码,因为这不是真正的URL,只是它的一部分。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

实际上%25是%的编码所以当你输入%20时它将%编码为%25并且20保持相同。所以你必须在@Query参数

中伪造它的编码
@Query(value="nickname",encodeValue = false) String nickname

现在你可以用%20调用它,它可以正常工作

createMyStuff("Auth","John%20%20Doe","lang",new Callback<MyResponse>{....});

答案 1 :(得分:0)

在Retrofit2中,参数名称和值默认为URL编码。您需要添加/Users/nimrodshai/Documents/Projects/WeatherJS/node_modules/firebaseui/dist/npm.js:30 componentHandler["register"]=componentHandler.register;componentHandler["downgradeElements"]=componentHandler.downgradeElements;window.componentHandler=componentHandler;window["componentHandler"]=componentHandler; ^ ReferenceError: window is not defined at /Users/nimrodshai/Documents/Projects/WeatherJS/node_modules/firebaseui/dist/npm.js:30:129 at Object.<anonymous> (/Users/nimrodshai/Documents/Projects/WeatherJS/node_modules/firebaseui/dist/npm.js:420:460) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Module.require (internal/modules/cjs/loader.js:637:17) at require (internal/modules/cjs/helpers.js:22:18) at Object.<anonymous> (/Users/nimrodshai/Documents/Projects/WeatherJS/JS/server.js:8:18) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3) 才能更改此行为。

encoded = true