Можно ли добавить сегмент пути после параметра запроса в OkHttp?

#java #okhttp

#java #okhttp

Вопрос:

У меня есть HTTP-URL:

 HttpUrl httpurl = new HttpUrl.Builder()
.scheme("https")
.host("www.example.com")
.addQueryParameter("parameter", "p")
.addPathSegment("extrasegment")
.build();
 

Параметр запроса всегда заканчивается последним. Как я могу обеспечить соблюдение того порядка, который я хочу?

Редактировать:

Причина, по которой я пытаюсь добиться этого, заключается в том, что я хочу иметь доступ к определенным конечным точкам, которые отформатированы следующим образом:

https://host/api/{parameter}/anothersegment

Комментарии:

1. В спецификации URI указано, что параметры запроса всегда следуют за сегментами пути. (См tools.ietf.org/html/rfc3986#section-3 ) Таким образом, «параметр запроса», который вы предлагаете, на самом деле не является параметром запроса, а скорее частью сегмента пути. Было бы полезно, если бы вы могли добавить пример результата, которого вы пытаетесь достичь.

2. Будет ли желаемым результатом приведенного выше кода быть https://host/api/p/anothersegment или https://host/api/parameter=p/anothersegment (затем правильно закодированный URL-адрес)?

3. Спасибо вам обоим за ввод. В конце концов, ответ @JensV помог мне найти решение.

Ответ №1:

Я предполагаю (из исходного вопроса), что требуется что-то вроде следующего:

 https://www.example.com/?param=p/anothersegment
 

Принимая во внимание спецификацию URI, которая определяет это:

 scheme ":" hier-part [ "?" query ] [ "#" fragment ]
 

URL-адрес будет выглядеть примерно так:

 scheme = https
hier-part = www.example.com/
query = param=p/anothersegment
 

Чего вы можете добиться следующим образом:

 HttpUrl httpurl = new HttpUrl.Builder()
.scheme("https")
.host("www.example.com")
.addEncodedQueryParameter("param", "p/anotersegment")
// Use `EncodedQueryParamter` to prevent escaping the slashes and other special characters. (You need to escape values yourself though)
.build();
 

Хотя из редактирования можно предположить, что вы хотите добиться чего-то подобного:

 https://www.example.com/foo=bar/baz=xy
 

Где foo=bar и baz=xy — это просто дополнительные сегменты пути, которые вы можете добавить с помощью addPathSegment