Ответ 1
Android не делает это легко.
В моем случае мне пришлось взять базовый URL-адрес, который может содержать или не включать путь:
http://www.myurl.com/myapi/
... и добавьте путь метода API REST, например:
api/where/agencies-with-coverage.json
... для создания всего URL:
http://www.myurl.com/myapi/api/where/agencies-with-coverage.json
Здесь, как я это сделал (скомпилированный из различных методов в приложении - может быть, более простой способ сделать это):
String baseUrlString = "http://www.myurl.com/myapi/";
String pathString = "api/where/agencies-with-coverage.json";
Uri.Builder builder = new Uri.Builder();
builder.path(pathString);
Uri baseUrl = Uri.parse(baseUrlString);
// Copy partial path (if one exists) from the base URL
Uri.Builder path = new Uri.Builder();
path.encodedPath(baseUrl.getEncodedPath());
// Then, tack on the rest of the REST API method path
path.appendEncodedPath(builder.build().getPath());
// Finally, overwrite builder with the full URL
builder.scheme(baseUrl.getScheme());
builder.encodedAuthority(baseUrl.getEncodedAuthority());
builder.encodedPath(path.build().getEncodedPath());
// Final Uri
Uri finalUri = builder.build();
В моем случае классы Builder для кода клиента API собрали path
до объединения его с baseURL
, так что объясняет порядок вещей выше.
Если я правильно спрятал вышеуказанный код, он должен обрабатывать номера портов, а также пробелы в строке URL.
Я вытащил этот исходный код из приложения OneBusAway для Android, в частности ObaContext
класс. Обратите внимание, что этот код в Github также обрабатывает дополнительный случай, когда пользователь вводил baseURL
(String serverName = Application.get().getCustomApiUrl()
в приведенном выше коде), который должен переопределять базовый URL-адрес региона (mRegion.getObaBaseUrl()
), а введенный пользователем URL-адрес не может перед http://
.
Единичные тесты, которые передаются для вышеуказанного кода в Github, включая случаи, когда номера портов и пробелы включены в baseURL
и path
, а верхний/конечный /
могут включать или не включать, являются здесь, на Github. Связанные с этим проблемы в Github, где я стучал головой о стену, чтобы попытаться заставить все это работать - 72, 126, 132.
Я не пробовал это с URI без HTTP, но я считаю, что он может работать в более общем плане.