2014-11-11 5 views
0

QT : 최종 URL을 인코딩하지 않고 문자열에서 QUrl 또는 다른 URL 클래스 개체를 만드는 방법이 있는지 궁금합니다. URL에 매개 변수를 전달하면서QT : 퍼센트 인코딩이없는 QUrl

QString GetJsonStringFromURL(QString url) //url == "192.168.0.111/controller?POSITION|03|100" 
{ 
    QEventLoop eventLoop; 
    QNetworkAccessManager mgr; 
    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); 

    QNetworkRequest req(QUrl::fromUserInput(url)) ; 

    QNetworkReply *reply = mgr.get(req); 
    eventLoop.exec(); //wait till reply finished 
    QString strReply = reply->readAll(); 
    return strReply; 
} 

이 코드는,이 get 메소드와 JSON의 요청 로컬 영역 네트워크 컨트롤러에 액세스 : 예를 들어, 다음은 내 코드의 조각이다. 내가 피하려고

"192.168.0.111/controller?POSITION%7C03%7C100"

: 내가 전달 해요 URL이로 인코딩 된 퍼센트를 가져옵니다. 내가 액세스하려고하는 서버는 퍼센트 디코딩을 포함하지 않는 C로 작성된 펌웨어가있는 사용자 정의 하드웨어입니다. 나는 서버 측에서 유지 보수를하고 싶지 않다. QUrl 클래스 참조를 시도했지만 사용 가능한 메서드 중 원하는 결과를 제공하지 못했습니다.

답변

2

각 요청에 대상을 저장하고 내부적으로 인코딩 된 문자열로 변환되는 QUrl 개체가 필요하기 때문에 QNetworkRequest에서는이 작업을 수행 할 수 없습니다.

setRawHeader은 GET 요청의 일부인 URL을 제외한 모든 HTTP 헤더를 설정할 수 있으므로 사용자를 위해 작동하지 않습니다.

확인 원시 HTTP 헤더 형식 curl -v http://stackoverflow.com/questions/

GET /questions/ HTTP/1.1 
User-Agent: curl/7.37.1 
Host: stackoverflow.com 
Accept: */* 

따라서 당신은 (내가 더 경험이없는) socket connection 완전히 원시가 필요합니다.

+0

연구 2 일 후에 고맙습니다. 나는 이것을 포기하고 당신이 옳은 것처럼 비표준 URL을 변경하려고한다. QUrl 클래스는 표준 URL 컨벤션을 사용하여 문자열을 파싱하고 인코딩한다. –

+0

좋아, d는 upvote을 인정하고이 대답을 받아들입니다. –

+0

답변을 수락했지만 내 담당자가 너무 낮습니다 upvote :) –

0

Qurl에는 디코드 기능이 있습니다. QUrl :: decode()를 살펴보십시오. 그렇지 않으면 QUrl :: fromPercentEncoding (url.toEncoded())으로 전달할 때 인코딩을 방지 할 수 있지만 복잡한 쿼리 문자열이있는 경우 문자열 무결성이 손실 될 수 있습니다.

개인적으로 사용하지는 않았지만 수업 참조에서 아무것도 찾을 수 없다고 언급하면서 게시 할 예정입니다.

+0

나는이 방법들을 보았고 그것들을 테스트했다. 아무도 원하는 결과를 제공하지 못했다. :(지금부터 fromPercentEncoding을 사용해 보았습니다. 문자열은 다시 인코딩됩니다.이 URL 형식은 네트워크 클래스에서 필요하므로 잘못된 형식을 허용하지 않습니다. –