자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi Rest Api 질문입니다.
2020.01.22 20:12
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
Xe8 Vcl 로 개발중입니다.
네이버 Rest Api 중 쇼핑 API 을 json 으로 호출 합니다..
procedure TForm1.GetNaverShop(AGubun:string);
var
Param: TRESTRequestParameter;
Url, token: string;
Stream: TMemoryStream;
JSONResponse : TJSONObject; //use System.JSON
jValue : TJSONValue; // use System.JSON
begin
Memo1.Lines.Clear;
RESTClient1.BaseURL := 'https://openapi.naver.com';
RESTClient1.Accept := '*/*';
RESTClient1.AcceptCharset := 'UTF-8';
RESTClient1.UserAgent := 'curl/7.49.1';
RESTRequest1.Client := RESTClient1;
RESTRequest1.Response := RESTResponse1;
RESTRequest1.Method := rmGET;
RESTRequest1.Resource := '/v1/search/shop.json?query={query}&display=10&start=1&sort=sim';
RESTRequest1.Params.ParameterByName('query').Value := EDdescr.Text;
Param := RESTRequest1.Params.AddHeader('X-Naver-Client-Id', 'myid');
Param := RESTRequest1.Params.AddHeader('X-Naver-Client-Secret', 'my secret');
Param.Options := [TRESTRequestParameterOption.poDoNotEncode];
RESTRequest1.Execute;
Memo1.Lines.Text := RESTResponse1.Content;
-------Execute-----하고 나면 아래 ---결과 파일-- 이 만들어 집니다.
try
Url := RESTResponse1.JSONValue.GetValue<String>('image'); //----(1)이부분에서 에러 발생
Except
On E:Exception do begin
Memo1.lines.Add(e.Message);
Exit;
end;
end;
RESTClient2.BaseURL := Url;
RESTRequest2.ExecuteAsync(procedure
begin
Stream := TMemoryStream.Create;
try
Stream.WriteData(RESTResponse2.RawBytes, RESTResponse2.ContentLength);
//ImageControl1.Bitmap.LoadFromStream(Stream);
Image1.Picture.Bitmap.LoadFromStream(Stream);// (2)
finally
Stream.Free;
end;
end
);
end;
질문)
(1)에서 에러 발생원인이 "image" 의 "" 와 관련이 있는건가요.?
(2)VCL에서 사용하기 위해 Image1 사용함
감사합니다.
---결과 파일--
{
"lastBuildDate": "Wed, 22 Jan 2020 19:53:28 +0900",
"total": 1808,
"start": 1,
"display": 10,
"items": [
{
"title": "농심 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=6725761862",
"image": "https://shopping-phinf.pstatic.net/main_6725761/6725761862.20191231185207.jpg",
"lprice": "2980",
"hprice": "70810",
"mallName": "네이버",
"productId": "6725761862",
"productType": "1"
},
{
"title": "농심 대용량 스낵 (지퍼백) <b>새우깡</b> 포스틱 꿀꽈배기 자갈치 오징어집 조청유과 감자깡",
"link": "https://search.shopping.naver.com/gate.nhn?id=82263818665",
"image": "https://shopping-phinf.pstatic.net/main_8226381/82263818665.3.jpg",
"lprice": "2850",
"hprice": "0",
"mallName": "농심공식몰",
"productId": "82263818665",
"productType": "2"
},
{
"title": "농심 매운 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=8588558030",
"image": "https://shopping-phinf.pstatic.net/main_8588558/8588558030.20150622134018.jpg",
"lprice": "3090",
"hprice": "37740",
"mallName": "네이버",
"productId": "8588558030",
"productType": "1"
},
{
"title": "농심 매운<b>새우깡400g</b> 과자 봉지과자 스낵",
"link": "https://search.shopping.naver.com/gate.nhn?id=18674959336",
"image": "https://shopping-phinf.pstatic.net/main_1867495/18674959336.1.jpg",
"lprice": "3990",
"hprice": "0",
"mallName": "쿠팡",
"productId": "18674959336",
"productType": "2"
},
{
"title": "농심 <b>새우깡400g</b> 농심 새우깡 매운 <b>새우깡 400g</b> 노래방 대용량과자",
"link": "https://search.shopping.naver.com/gate.nhn?id=21667660865",
"image": "https://shopping-phinf.pstatic.net/main_2166766/21667660865.jpg",
"lprice": "2980",
"hprice": "0",
"mallName": "티몬",
"productId": "21667660865",
"productType": "2"
},
{
"title": "농심 새우깡 매운 <b>새우깡 400g</b> 노래방 대용량과자",
"link": "https://search.shopping.naver.com/gate.nhn?id=80132527240",
"image": "https://shopping-phinf.pstatic.net/main_8013252/80132527240.1.jpg",
"lprice": "3000",
"hprice": "0",
"mallName": "빅카트",
"productId": "80132527240",
"productType": "2"
},
{
"title": "농심 <b>새우깡 400G</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=7789394589",
"image": "https://shopping-phinf.pstatic.net/main_7789394/7789394589.jpg",
"lprice": "4100",
"hprice": "0",
"mallName": "롯데프레시",
"productId": "7789394589",
"productType": "2"
},
{
"title": "농심 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=5743436445",
"image": "https://shopping-phinf.pstatic.net/main_5743436/5743436445.20191231184909.jpg",
"lprice": "3500",
"hprice": "29940",
"mallName": "네이버",
"productId": "5743436445",
"productType": "1"
},
{
"title": "(농심) 노래방 <b>새우깡 400G</b> X 6개 1박스",
"link": "https://search.shopping.naver.com/gate.nhn?id=11450498354",
"image": "https://shopping-phinf.pstatic.net/main_1145049/11450498354.1.jpg",
"lprice": "19300",
"hprice": "0",
"mallName": "대진물류",
"productId": "11450498354",
"productType": "2"
},
{
"title": "대용량 스낵 8종 골라담기 <b>새우깡400g</b> 외",
"link": "https://search.shopping.naver.com/gate.nhn?id=21606646713",
"image": "https://shopping-phinf.pstatic.net/main_2160664/21606646713.jpg",
"lprice": "2720",
"hprice": "0",
"mallName": "인터파크",
"productId": "21606646713",
"productType": "2"
}
]
}
댓글 3
-
관리자
2020.01.23 05:30
-
험프리
2020.01.23 09:21
네이버 쇼핑 REST API와 연동하는데, 상품 목록의 이미지를 화면에 출력하려 하는 것으로 보입니다.
두가지로 안내를 드리면 도움이 될것 같습니다.
1) JSON에서 원하는 값을 가져오기
2) 목록(JSONArray) 데이터 활용하기
1) JSON에서 원하는 값을 가져오기
JSON에서 값을 지정 시 경로를 지정할 수 있습니다.
기존에 사용한 아래 구문은 JSON 에서 바로 image 속성을 가져오는 것입니다.
Url := RESTResponse1.JSONValue.GetValue<String>('image');
아래와 같이 ROOT 바로 아래에 image 속성이 있는 경우 사용해야 합니다.
{
"title": {TITLE},
"image": {URL}
}
하지만 네이버에서 제공하는 JSON 포맷에서 image는 items 배열 하위에 image 속성에 있습니다.
다음과 같이 지정해야 오류를 피할 수 있습니다.
Url := RESTResponse1.JSONValue.GetValue<String>('items[0].image');
2) 목록(JSONArray) 데이터 활용하기
1)의 조치대로 진행하면 목록(JSONArray)의 첫번째 항목의 이미지만 처리할 수 있습니다.
만약, 목록의 데이터를 모두 사용할 필요가 있다면, JSON 배열을 데이터셋으로 변환해 데이터셋으로 활용하는 것을 추천드립니다.
직접 JSON 데이터를 분석해 데이터셋으로 변환할수도 있지만, 델파이에서는 TRESTResponseDataSetAdapter컴포넌트를 통해 해당 기능을 지원합니다.
위 컴포넌트는 JSON 데이터에서 배열 속성을 RootElement로 지정하면 배열의 데이터를 기반으로 데이터셋으로 전환해주는 역할을 합니다.
자세한 내용은 다음 예제의 참고해 보시기 바랍니다
[REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) -
https://tech.devgear.co.kr/delphi_news/433465
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-
희망나라
2020.01.28 14:06
답변 감사합니다.
관리자님, 험프리 님 알려주신 대로 테스트 해 보았습니다.
Response1의 RootElement를 활용하여 관리자님이 알려주신 방법으로 처리 했습니다.
--버그--
윈10 64, 플랫폼 64 선택후 디버그 모드로 진행하면 브레이크 포인트가 작동하지 않습니다(플랫폼32 로 선택하면 작동함)
윈10 64 에서 주석 한글입력시 현재 입력하는 글자가 작게 나옵니다.
ex)"대한민국" 입력 -> "대"을 타이핑하면 폰트가 매우 작게 나오며, "한"을 입력시작 하면 "대" 가 올바르게 나옵니다.
----
클릭 이벤트 등을 입력할때 항상 맨 마지막 라인에 이벤트을 추가 할수 있나요.?
지금은 코딩한 라인 중간에 삽입 되어져 매번 잘라내기 해서 원하는 위치로 옮긴후 코딩 하고 있습니다.
Delphi Rest Api 질문입니다.
2020.01.22 20:12
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
Xe8 Vcl 로 개발중입니다.
네이버 Rest Api 중 쇼핑 API 을 json 으로 호출 합니다..
procedure TForm1.GetNaverShop(AGubun:string);
var
Param: TRESTRequestParameter;
Url, token: string;
Stream: TMemoryStream;
JSONResponse : TJSONObject; //use System.JSON
jValue : TJSONValue; // use System.JSON
begin
Memo1.Lines.Clear;
RESTClient1.BaseURL := 'https://openapi.naver.com';
RESTClient1.Accept := '*/*';
RESTClient1.AcceptCharset := 'UTF-8';
RESTClient1.UserAgent := 'curl/7.49.1';
RESTRequest1.Client := RESTClient1;
RESTRequest1.Response := RESTResponse1;
RESTRequest1.Method := rmGET;
RESTRequest1.Resource := '/v1/search/shop.json?query={query}&display=10&start=1&sort=sim';
RESTRequest1.Params.ParameterByName('query').Value := EDdescr.Text;
Param := RESTRequest1.Params.AddHeader('X-Naver-Client-Id', 'myid');
Param := RESTRequest1.Params.AddHeader('X-Naver-Client-Secret', 'my secret');
Param.Options := [TRESTRequestParameterOption.poDoNotEncode];
RESTRequest1.Execute;
Memo1.Lines.Text := RESTResponse1.Content;
-------Execute-----하고 나면 아래 ---결과 파일-- 이 만들어 집니다.
try
Url := RESTResponse1.JSONValue.GetValue<String>('image'); //----(1)이부분에서 에러 발생
Except
On E:Exception do begin
Memo1.lines.Add(e.Message);
Exit;
end;
end;
RESTClient2.BaseURL := Url;
RESTRequest2.ExecuteAsync(procedure
begin
Stream := TMemoryStream.Create;
try
Stream.WriteData(RESTResponse2.RawBytes, RESTResponse2.ContentLength);
//ImageControl1.Bitmap.LoadFromStream(Stream);
Image1.Picture.Bitmap.LoadFromStream(Stream);// (2)
finally
Stream.Free;
end;
end
);
end;
질문)
(1)에서 에러 발생원인이 "image" 의 "" 와 관련이 있는건가요.?
(2)VCL에서 사용하기 위해 Image1 사용함
감사합니다.
---결과 파일--
{
"lastBuildDate": "Wed, 22 Jan 2020 19:53:28 +0900",
"total": 1808,
"start": 1,
"display": 10,
"items": [
{
"title": "농심 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=6725761862",
"image": "https://shopping-phinf.pstatic.net/main_6725761/6725761862.20191231185207.jpg",
"lprice": "2980",
"hprice": "70810",
"mallName": "네이버",
"productId": "6725761862",
"productType": "1"
},
{
"title": "농심 대용량 스낵 (지퍼백) <b>새우깡</b> 포스틱 꿀꽈배기 자갈치 오징어집 조청유과 감자깡",
"link": "https://search.shopping.naver.com/gate.nhn?id=82263818665",
"image": "https://shopping-phinf.pstatic.net/main_8226381/82263818665.3.jpg",
"lprice": "2850",
"hprice": "0",
"mallName": "농심공식몰",
"productId": "82263818665",
"productType": "2"
},
{
"title": "농심 매운 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=8588558030",
"image": "https://shopping-phinf.pstatic.net/main_8588558/8588558030.20150622134018.jpg",
"lprice": "3090",
"hprice": "37740",
"mallName": "네이버",
"productId": "8588558030",
"productType": "1"
},
{
"title": "농심 매운<b>새우깡400g</b> 과자 봉지과자 스낵",
"link": "https://search.shopping.naver.com/gate.nhn?id=18674959336",
"image": "https://shopping-phinf.pstatic.net/main_1867495/18674959336.1.jpg",
"lprice": "3990",
"hprice": "0",
"mallName": "쿠팡",
"productId": "18674959336",
"productType": "2"
},
{
"title": "농심 <b>새우깡400g</b> 농심 새우깡 매운 <b>새우깡 400g</b> 노래방 대용량과자",
"link": "https://search.shopping.naver.com/gate.nhn?id=21667660865",
"image": "https://shopping-phinf.pstatic.net/main_2166766/21667660865.jpg",
"lprice": "2980",
"hprice": "0",
"mallName": "티몬",
"productId": "21667660865",
"productType": "2"
},
{
"title": "농심 새우깡 매운 <b>새우깡 400g</b> 노래방 대용량과자",
"link": "https://search.shopping.naver.com/gate.nhn?id=80132527240",
"image": "https://shopping-phinf.pstatic.net/main_8013252/80132527240.1.jpg",
"lprice": "3000",
"hprice": "0",
"mallName": "빅카트",
"productId": "80132527240",
"productType": "2"
},
{
"title": "농심 <b>새우깡 400G</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=7789394589",
"image": "https://shopping-phinf.pstatic.net/main_7789394/7789394589.jpg",
"lprice": "4100",
"hprice": "0",
"mallName": "롯데프레시",
"productId": "7789394589",
"productType": "2"
},
{
"title": "농심 <b>새우깡 400g</b>",
"link": "https://search.shopping.naver.com/gate.nhn?id=5743436445",
"image": "https://shopping-phinf.pstatic.net/main_5743436/5743436445.20191231184909.jpg",
"lprice": "3500",
"hprice": "29940",
"mallName": "네이버",
"productId": "5743436445",
"productType": "1"
},
{
"title": "(농심) 노래방 <b>새우깡 400G</b> X 6개 1박스",
"link": "https://search.shopping.naver.com/gate.nhn?id=11450498354",
"image": "https://shopping-phinf.pstatic.net/main_1145049/11450498354.1.jpg",
"lprice": "19300",
"hprice": "0",
"mallName": "대진물류",
"productId": "11450498354",
"productType": "2"
},
{
"title": "대용량 스낵 8종 골라담기 <b>새우깡400g</b> 외",
"link": "https://search.shopping.naver.com/gate.nhn?id=21606646713",
"image": "https://shopping-phinf.pstatic.net/main_2160664/21606646713.jpg",
"lprice": "2720",
"hprice": "0",
"mallName": "인터파크",
"productId": "21606646713",
"productType": "2"
}
]
}
댓글 3
-
관리자
2020.01.23 05:30
-
험프리
2020.01.23 09:21
네이버 쇼핑 REST API와 연동하는데, 상품 목록의 이미지를 화면에 출력하려 하는 것으로 보입니다.
두가지로 안내를 드리면 도움이 될것 같습니다.
1) JSON에서 원하는 값을 가져오기
2) 목록(JSONArray) 데이터 활용하기
1) JSON에서 원하는 값을 가져오기
JSON에서 값을 지정 시 경로를 지정할 수 있습니다.
기존에 사용한 아래 구문은 JSON 에서 바로 image 속성을 가져오는 것입니다.
Url := RESTResponse1.JSONValue.GetValue<String>('image');
아래와 같이 ROOT 바로 아래에 image 속성이 있는 경우 사용해야 합니다.
{
"title": {TITLE},
"image": {URL}
}
하지만 네이버에서 제공하는 JSON 포맷에서 image는 items 배열 하위에 image 속성에 있습니다.
다음과 같이 지정해야 오류를 피할 수 있습니다.
Url := RESTResponse1.JSONValue.GetValue<String>('items[0].image');
2) 목록(JSONArray) 데이터 활용하기
1)의 조치대로 진행하면 목록(JSONArray)의 첫번째 항목의 이미지만 처리할 수 있습니다.
만약, 목록의 데이터를 모두 사용할 필요가 있다면, JSON 배열을 데이터셋으로 변환해 데이터셋으로 활용하는 것을 추천드립니다.
직접 JSON 데이터를 분석해 데이터셋으로 변환할수도 있지만, 델파이에서는 TRESTResponseDataSetAdapter컴포넌트를 통해 해당 기능을 지원합니다.
위 컴포넌트는 JSON 데이터에서 배열 속성을 RootElement로 지정하면 배열의 데이터를 기반으로 데이터셋으로 전환해주는 역할을 합니다.
자세한 내용은 다음 예제의 참고해 보시기 바랍니다
[REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) -
https://tech.devgear.co.kr/delphi_news/433465
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-
희망나라
2020.01.28 14:06
답변 감사합니다.
관리자님, 험프리 님 알려주신 대로 테스트 해 보았습니다.
Response1의 RootElement를 활용하여 관리자님이 알려주신 방법으로 처리 했습니다.
--버그--
윈10 64, 플랫폼 64 선택후 디버그 모드로 진행하면 브레이크 포인트가 작동하지 않습니다(플랫폼32 로 선택하면 작동함)
윈10 64 에서 주석 한글입력시 현재 입력하는 글자가 작게 나옵니다.
ex)"대한민국" 입력 -> "대"을 타이핑하면 폰트가 매우 작게 나오며, "한"을 입력시작 하면 "대" 가 올바르게 나옵니다.
----
클릭 이벤트 등을 입력할때 항상 맨 마지막 라인에 이벤트을 추가 할수 있나요.?
지금은 코딩한 라인 중간에 삽입 되어져 매번 잘라내기 해서 원하는 위치로 옮긴후 코딩 하고 있습니다.
1. 우선 정확한 Error 정보를 알려주시면, 문제 파악을 정확히 하는데 도움이 됩니다. 뭐라고 나오나요?
2. 추측컨데, 결과 JSON을 볼 때, 'items' 이라는 키에 해당하는 값은 JSONArrary 형식으로 되어 있습니다. 따라서 그 JSON Array를 가져와서 그 안에 담겨있는 각 JSON Object를 반복하면서 해당 JSON Object 안에 있는 'image'라는 키에 해당하는 값을 JSONString 읽는 것이 맞습니다.
3. JSONArray를 델파이에서 파싱하는 방법은 매우 간단합니다. https://tech.devgear.co.kr/420944 문의에 대한 답글 중에도 참고할 만한 코드가 있습니다.
Response1의, RootElement를 'items'라고 지정하면, items의 값들만 다루면 되어서 더 간편합니다. RootElement도 잘 활용해보세요. 아래 코드는 그렇게 했다는 가정 하에 작성되었습니다.(RootElement를 사용하지 않는다면, 먼저 Response1에서 items의 값을 TJSONValue에 담으면 됩니다.)