วิธีการเขียน URL หรือ URI ใน Java เป็นสำนวนอะไร?


115

ฉันจะสร้าง URL หรือ URI ใน Java ได้อย่างไร มีวิธีสำนวนหรือห้องสมุดที่ทำสิ่งนี้ได้อย่างง่ายดายหรือไม่?

ฉันต้องการอนุญาตให้เริ่มจากสตริงคำขอแยกวิเคราะห์ / เปลี่ยนส่วน URL ต่างๆ (โครงร่างโฮสต์เส้นทางสตริงการสืบค้น) และรองรับการเพิ่มและเข้ารหัสพารามิเตอร์การสืบค้นโดยอัตโนมัติ


7
การโหวตคำถามหลังจากปิดไปนานแล้วเนื่องจากไม่ชัดเจนว่ามีวิธีแก้ไขปัญหาที่ไม่ได้รับการสนับสนุนที่เป็นที่นิยมหรือไม่ ฉันพบสิ่งนี้โดย googling สำหรับ 'java URL parameter class'
user1445967

4
เจตนาของฉันคือการค้นหาตัวสร้าง URL สำหรับ Java และคำถามนี้ก็มีประโยชน์สำหรับฉันอย่างน้อย
whirlwin

คำตอบ:


76

จาก Apache HTTP Component HttpClient 4.1.3 จากบทช่วยสอนอย่างเป็นทางการ:

public class HttpClientTest {
public static void main(String[] args) throws URISyntaxException {
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("q", "httpclient"));
    qparams.add(new BasicNameValuePair("btnG", "Google Search"));
    qparams.add(new BasicNameValuePair("aq", "f"));
    qparams.add(new BasicNameValuePair("oq", null));
    URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
                                 URLEncodedUtils.format(qparams, "UTF-8"), null);
    HttpGet httpget = new HttpGet(uri);
    System.out.println(httpget.getURI());
    //http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
}
}

แก้ไข: เมื่อ v4.2 URIUtils.createURI()เลิกใช้งานแล้วเพื่อประโยชน์ของURIBuilder:

URI uri = new URIBuilder()
        .setScheme("http")
        .setHost("www.google.com")
        .setPath("/search")
        .setParameter("q", "httpclient")
        .setParameter("btnG", "Google Search")
        .setParameter("aq", "f")
        .setParameter("oq", "")
        .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

20
สิ่งนี้ใช้งานได้ แต่เมื่อถึง v4.2 URIUtils.createURI () ถูกเลิกใช้เพื่อสนับสนุน URIBuilder ในด้านบวก URIBuilder นี้ดูเหมือนจะมีเมธอด addParameter () ดังนั้นการสร้างสตริงคำขออย่างน้อยก็ควรจะง่ายกว่านี้
stian

6
URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("www.google.com") .setParameters(qparams);ตามที่ @stian กล่าว
vanduc1102

Println ด้านบนพิมพ์สิ่งต่อไปนี้ google.com/…
Berkan Ercan

61

ในฐานะผู้เขียนฉันอาจไม่ใช่คนที่ดีที่สุดที่จะตัดสินว่าตัวสร้าง URL / URI ของฉันดีหรือไม่ แต่ที่นี่ก็ยังเป็น: https://github.com/mikaelhg/urlbuilder

ฉันต้องการโซลูชันที่ง่ายที่สุดเท่าที่จะเป็นไปได้โดยมีการพึ่งพาศูนย์นอก JDK ดังนั้นฉันจึงต้องม้วนของตัวเอง


6
มิคาเอลดูดีมากคุณเคยคิดจะเผยแพร่ไปยัง maven central ไหม? ฉันรู้ว่ามันเล็ก แต่ทำให้ใช้งานได้ง่ายขึ้น ฉันไม่พบคลาสที่คล้ายกันนอกจากใน JAX-RS การขาดการพึ่งพาเป็นข้อดีอย่างแน่นอน
Barry Pitman

มันดูดี แต่เนื่องจากเป็นตัวสร้างและไม่แน่นอนเหตุใดจึงมีตัวตั้งค่าสำหรับพารามิเตอร์เท่านั้น แต่ไม่ใช่สำหรับโฮสต์พอร์ตโปรโตคอลและเส้นทาง และดีไม่มี getters สำหรับคนเหล่านั้นด้วย UPD: โอ้มันไม่เปลี่ยนแปลง - setParameter สร้างโคลน ยังคง setHost / setPort / ... สามารถทำงานในลักษณะเดียวกัน หรือบางทีเวอร์ชันที่ไม่แน่นอนก็น่าจะดีเช่นกัน
mvmn

3
"วิธีแก้ปัญหาที่ง่ายที่สุดที่เป็นไปได้โดยไม่มีการพึ่งพาเป็นศูนย์" - ดูเหมือนว่าคุณจะรู้ว่าอะไรสำคัญ! คำตอบของคุณควรเป็นคำตอบที่ได้รับการยอมรับ รวมถึง HttpClient ทั้งหมด (ด้วยการอัปเดตเวอร์ชันทั้งหมดและแม้กระทั่งการเลิกใช้งาน API ที่เป็นคำถามนี้) เพียงแค่สร้าง url เป็นสิ่งที่สร้างขึ้นสำหรับแอปที่มีข้อผิดพลาดอันดับต้น ๆ
Stijn de Witt

2
ในที่สุด Maven Central และฉันใช้เวลาเพียงสี่ปีในการทำ
Mikael Gueck

@mikaelhg ขอบคุณ! ฉันต้องการในช่วงเวลานี้!
Fabian Damken


29

การใช้ HTTPClient ทำงานได้ดี

protected static String createUrl(List<NameValuePair> pairs) throws URIException{

  HttpMethod method = new GetMethod("http://example.org");
  method.setQueryString(pairs.toArray(new NameValuePair[]{}));

  return method.getURI().getEscapedURI();

}

6
ขณะนี้ฟังก์ชันนี้เลิกใช้งานแล้ว ไม่มีใครรู้วิธีใช้แพ็คเกจ HTTP Components ใหม่เพื่อทำเช่นเดียวกันเพราะมันทำให้ฉันนิ่งงัน
Link19

3
4x เวอร์ชันใหม่ไม่รองรับสิ่งนี้อีกต่อไป
Joscha

13

มีห้องสมุดมากมายที่สามารถช่วยคุณสร้าง URI ได้ (อย่าสร้างวงล้อใหม่) นี่คือสามสิ่งที่จะช่วยให้คุณเริ่มต้น:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents: httpclient: 4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework: ฤดูใบไม้ผลิเว็บ: 4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

ดูเพิ่มเติมที่: GIST> การทดสอบตัวสร้าง URI


2
EE 7 คือคำตอบที่ถูกต้อง สิ่งที่คุณต้องทำคือดึงชุดไลบรารี EE ทั้งหมดเลือกการใช้งาน JAX-RS แก้ไขความขัดแย้งของเวอร์ชัน jax-rs และเป็นรางวัลคุณจะได้รับคลาส UriBuilder ที่ใช้งานได้จริงซึ่งใช้งานได้ดีจริงๆ นี่คือคำตอบที่ถูกต้อง :)
tekHedd

1
ตั้งแต่ฤดูใบไม้ผลิที่ 5 โปรดดูUriBuilder( docs.spring.io/spring-framework/docs/current/javadoc-api/org/… ) และ UriBuilderFactory( docs.spring.io/spring-framework/docs/current/javadoc-api/org / … )
Brice Roncace

10

ใช้ OkHttp

เป็นปี2020และมีไลบรารียอดนิยมชื่อOkHttpซึ่งติดดาว35Kครั้งบน GitHub ด้วยไลบรารีนี้คุณสามารถสร้าง url ดังต่อไปนี้:

import okhttp3.HttpUrl;

URL url = new HttpUrl.Builder()
    .scheme("http")
    .host("example.com")
    .port(4567)
    .addPathSegment("foldername/1234")
    .addQueryParameter("abc", "xyz")
    .build().url();

ฉันแก้ไขการพิมพ์ผิดมันaddPathSegment(ไม่ใช่addPathSegments)
PapaFreud

1

หลังจากถูกแกะเพื่อแนะนำคลาส URL ฉันจะรับคำแนะนำของผู้แสดงความคิดเห็นและแนะนำคลาส URIแทน ฉันขอแนะนำให้คุณดูตัวสร้างสำหรับ URI อย่างใกล้ชิดเนื่องจากคลาสนั้นไม่สามารถเปลี่ยนรูปได้เมื่อสร้างขึ้นแล้ว
ฉันคิดว่าตัวสร้างนี้ช่วยให้คุณตั้งค่าทุกอย่างใน URI ที่คุณต้องการได้

URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
          Constructs a hierarchical URI from the given components.

8
แต่ไม่มีฟังก์ชันในการสร้างและเข้ารหัสสตริงการสืบค้นจากชุดคู่ค่าชื่อ
Link19

4
ดังที่เด็กอัจฉริยะพูดกับอลันพาร์ทริดจ์ - ไม่มีใครสามารถย่อยสลายของการไม่เปลี่ยนรูปได้ไม่ว่าจะเป็นหรือไม่ก็ตาม ;-) youtube.com/watch?v=_lvFns5Lubc
Stewart

ตัวสร้างของ URI ทำสิ่งที่น่ารังเกียจต่อเส้นทาง ดูรายละเอียดได้ที่blog.palominolabs.com/2013/10/03/…
mpierce

1
ให้คำตอบนี้เป็นตัวอย่างของการไม่ทำเช่นนั้น
Mike Pone

1
ข้อความค้นหาสตริง ... ขอบคุณ Sun / Oracle สำหรับรายละเอียด เราจะแทนที่ช่องว่างทั้งหมดด้วยสัญลักษณ์บวก uri- เข้ารหัสพารามิเตอร์ทั้งหมดและเชื่อมโยงทั้งหมดเข้าด้วยกันด้วยเครื่องหมายแอมเพอร์แซนด์ด้วยตัวเราเองจากนั้น ... หัวเรียบบนโต๊ะซ้ำ ๆ
Stijn de Witt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.