2017-06-23 1 views
3

更新:問題がURLをエンコードする必要を行うにはではありません。これはRetrofitによって行われます。私はURLをエンコードして、改造することを渡すと、URLは二回エンコードされ、このように見える終わるます:はなぜレトロフィットは、私のURL要求から特定の文字を省略していますか?

https://example.com/api/get_user_info/?id=12345&[email protected]%257C1492357107%257CfyVzRUYC9h%257C4f889e1976c2cd87aac

%257Cに注意してください。第1ラウンドは| -> %7Cです。第二ラウンドは、%7C -> %257C

である私は、レトロフィットを使用してHTTP GETリクエストを実行しようとしています。要求は次のようになります。

Request{method=GET, url=https://example.com/api/get_user_info/?id=12345&[email protected]|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac, tag=null} 

(から撮影:私はこのクエリを実行すると、コードで https://example.com/api/get_user_info/?id=12345&[email protected]|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac

、呼び出しはこの

@GET("get_user_info") 
Call<ResponseBody> getUserMeta(
      @Query("id") int userId, 
      @Query("cookie") String cookie 
); 

のように見える、Requestは次のようになりますコンソール呼び出しが実行された後call.request().toString()

をログインした後、私は自分からエラーを受け取りますCookieが無効であることを示すAPI。応答は次のようになります。

(loggin Response<ResponseBody> response.toString()後にコンソールからの引用)
Response{protocol=h2, code=404, message=, url=https://example.com/api/get_user_info/?id=12345&[email protected]} 

あなたが見ることができるように、2つのURLは同じではありません。 |文字が何とか応答のURLでクッキーのパラメータから削除されました。

これは私のAPIと関係があり、実際にはCookieが正しくないと思われるかもしれませんが、RequestのURLをコピーしてブラウザに直接貼り付けると、エラーなし(ステータス200)で実行されます。レトロフィットがコールを実行した場合、私はレトロフィットが第二、間違ったURLを実行している、明らかに

404を取得します。最初のURLはブラウザで実行されたとき404を返さないが、2番目のURLは404を返すので、これは明らかです。

何が起こっていますか?どんな助けでも大歓迎です。

追加情報:

私は私のアプリモジュールのbuild.gradleにcompile 'com.squareup.retrofit2:retrofit:2.2.0'を使用しています。

私はそうのように私のレトロフィットクライアントをインスタンス化しています:

Retrofit retroFit = new Retrofit.Builder() 
        .baseUrl("https://example.com/api/") 
        .build(); 
+2

URLは%7C' – Compass

答えて

1

あなたはあなたのクッキーのencoding実装する必要があります:

@FormUrlEncoded 
@GET("get_user_info") 
Call<ResponseBody> getUserMeta(
    @Query("id") int userId, 
    @Query(value ="cookie", encode = true) String cookie 

    ); 
+0

ブリリアント!これは魅力的に機能しました! – grimrader22

+0

レトロフィットは、例外が発生します: 'java.lang.IllegalArgumentExceptionが:FormUrlEncodedのみリクエストボディ(例えば、@POST)とHTTPメソッドで指定することができます.' – Vasilisfoo

+0

あなたには、いくつかのコードで新しい質問をしている場合、それは素晴らしいアイデアになります@Vasilisfoo 。 – Ibrahim

-1

は、直接パイプ文字を渡すHTMLにそれをコードしていない、あなたのURLは次のようになります。

&[email protected]%7C1492357107%7CfyVzRUYC9h%7C4f889e1976c2cd87aac 

注意|

String encodedUrl = URLEncoder.encode("https://example.com/api/get_user_info/?id=12345&[email protected]|1492357107|fyVzRUYC9h|4f889e1976c2cd87aac", "utf-8"); 
+0

'とのパイプをエンコードした文字は%7C

それとものURLEncoder機能を使用することができますに置き換えられましたRetrofitではこれが必要ですか?私はそれが内部的に行われていると確信しています。私はそれが二回エンコードされていることを意味し、「%の257C」を、取得します。しかし、2つのURLは、だけではなく、%7Cの%の257Cと、同じになってしまうん。 – grimrader22

関連する問題